RecyclerView优化方案

先上个StackOverflow的解决方案,有空再做总结
原文地址:https://stackoverflow.com/questions/27188536/recyclerview-scrolling-performance

  1. 使用新的优化ConstraintLayout 替换复杂布局(嵌套视图,RelativeLayout)。在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下载的图像的提示:

    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. 来自Android Developer网站:

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

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

    adapter.setHasStableIds(true);

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

即使你做的一切都正确,很可能RecyclerView仍然没有你想要的那么顺利。

你可能感兴趣的:(RecyclerView优化方案)