我已经基于Creating Lists and Cards指南创建了RecyclerView示例。我的适配器具有仅用于扩大布局的模式实现。

问题是滚动性能差。 在RecycleView中只有8个项目。

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

最佳答案

我最近遇到了同样的问题,因此这是我对最新的RecyclerView支持库所做的工作:

  • 用新的优化的ConstraintLayout替换复杂的布局(嵌套 View ,RelativeLayout)。在Android Studio中激活它:转到SDK Manager-> SDK工具选项卡->支持存储库->检查ConstraintLayout(对于Android)和Solver(对于ConstraintLayout)。添加到依赖项:
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    
  • 如果可能,请使RecyclerView的所有元素的高度都等于。并添加:
    recyclerView.setHasFixedSize(true);
    
  • 使用默认的RecyclerView 工程图缓存方法,并根据您的情况进行调整。您不需要第三方库来这样做:
    recyclerView.setItemViewCacheSize(20);
    recyclerView.setDrawingCacheEnabled(true);
    recyclerView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
    
  • 如果您使用许多图像,请确保它们的大小和压缩率是最佳。缩放图像也可能会影响性能。问题有两个方面-使用的源图像和解码的位图。以下示例向您提示如何解码从网上下载的图像:
    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-它定义将为图像的每个像素使用多少个字节。请记住,这是首选。如果源图像具有更多颜色,则仍将使用其他配置对其进行解码。
  • 确保onBindViewHolder()上的尽可能便宜。您可以在onCreateViewHolder()中设置一次OnClickListener,并通过接口(interface)调用Adapter外部的监听器,并传递单击的项目。这样,您就不会一直创建额外的对象。在对 View 进行任何更改之前,还请检查标志和状态。
    viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
              Item item = getItem(getAdapterPosition());
              outsideClickListener.onItemClicked(item);
          }
    });
    
  • 更改数据后,尝试仅更新受影响的项目。例如,当添加/加载更多项目时,不要使用notifyDataSetChanged()使整个数据集无效,而只需使用:
    adapter.notifyItemRangeInserted(rangeStart, rangeEnd);
    adapter.notifyItemRemoved(position);
    adapter.notifyItemChanged(position);
    adapter.notifyItemInserted(position);
    
  • 来自Android Developer Web Site:



  • 但是,如果需要使用它,请使用唯一ID 维护商品:
        adapter.setHasStableIds(true);
    



    即使您做的一切正确,RecyclerView仍然有可能无法达到您想要的效果。

    关于java - Android RecyclerView滚动性能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27188536/

    10-11 22:44
    查看更多