安卓回收器查看滚动性能

我根据创建列表和卡片指南创建了RecyclerView示例。我的适配器有一个模式实现,仅用于膨胀布局。

问题是滚动性能差。这在只有8个项目的回收视图中。

在某些测试中,我验证了在Android L中不会发生此问题。但在KitKat版本中,性能的下降是显而易见的。


答案 1

我最近遇到了同样的问题,所以这就是我对最新的RecyclerView支持库所做的:

  1. 将复杂布局(嵌套视图、相对布局)替换为新的优化约束布局。在 Android Studio 中激活它:转到 SDK Manager -> SDK Tools 选项卡 -> Support Repository ->检查 ConstraintLayout for Android 和 Solver for ConstraintLayout。添加到依赖项:

    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    
  2. 如果可能,请将 RecyclerView 的所有元素都设置为相同的高度。并添加:

    recyclerView.setHasFixedSize(true);
    
  3. 使用默认的 RecyclerView 图形缓存方法,并根据您的情况进行调整。您不需要第三方库即可执行此操作:

    recyclerView.setItemViewCacheSize(20);
    recyclerView.setDrawingCacheEnabled(true);
    recyclerView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
    
  4. 如果使用许多图像,请确保其大小和压缩是最佳的。缩放图像也可能影响性能。问题有两个方面 - 使用的源图像和解码的位图。以下示例为您提供了如何解码从 Web 下载的 аn 图像的提示:

    InputStream is = (InputStream) url.getContent();
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inPreferredConfig = Bitmap.Config.RGB_565;
    Bitmap image = BitmapFactory.decodeStream(is, null, options);
    

最重要的部分是指定 - 它定义了图像的每个像素将使用多少字节。请记住,这是首选选项。如果源图像具有更多颜色,则仍将使用其他配置对其进行解码。inPreferredConfig

  1. 确保onBindViewHolder()尽可能便宜。您可以在一旦进入就设置 OnClickListener,并通过接口调用适配器外部的侦听器,从而传递单击的项。这样,您就不会一直创建额外的对象。在对此处的视图进行任何更改之前,还要检查标志和状态。onCreateViewHolder()

    viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
              Item item = getItem(getAdapterPosition());
              outsideClickListener.onItemClicked(item);
          }
    });
    
  2. 更改数据后,请尝试仅更新受影响的项目。例如,在添加更多项目时,不要使用 ,使整个数据集失效,只需使用:notifyDataSetChanged()

    adapter.notifyItemRangeInserted(rangeStart, rangeEnd);
    adapter.notifyItemRemoved(position);
    adapter.notifyItemChanged(position);
    adapter.notifyItemInserted(position);
    
  3. 来自安卓开发者网站

依靠 notifyDataSetChanged() 作为最后的手段。

但是,如果您需要使用它,请使用唯一的ID维护您的项目:

    adapter.setHasStableIds(true);

RecyclerView 将尝试为适配器合成可见的结构更改事件,这些适配器在使用此方法时报告它们具有稳定的 ID。这可以帮助实现动画和可视对象持久性,但仍需要重新生成和重新放置单个项目视图。

即使您做对了一切,RecyclerView也可能仍然没有像您希望的那样顺利运行。


推荐