一尘不染

RecyclerView滚动性能

java

我已经基于“ 创建列表和卡片”指南创建了RecyclerView示例。我的适配器具有仅用于扩大布局的模式实现。

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

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


阅读 266

收藏
2020-09-09

共1个答案

一尘不染

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

  1. 新的优化的ConstraintLayout 替换复杂的布局 (嵌套视图,RelativeLayout)。在Android Studio中激活它:转到SDK Manager->“ SDK工具”选项卡->支持存储库->选中Android的ConstraintLayout和ConstraintLayout的Solver。添加到依赖项:

    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    
  2. 如果可能,请使RecyclerView的所有元素具有 相同的height 。并添加:

    recyclerView.setHasFixedSize(true);
    
  3. 使用默认的RecyclerView 图形缓存 方法,并根据您的情况进行调整。您不需要第三方库来这样做:

        recyclerView.setItemViewCacheSize(20);
    recyclerView.setDrawingCacheEnabled(true);
    recyclerView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
  1. 如果使用很多 图像 ,请确保它们的 大小和压缩率最佳 。缩放图像也可能会影响性能。问题有两个方面-使用的源图像和解码的位图。以下示例向您提示如何解码从网上下载的图像:
        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()并通过接口调用Adapter外部的侦听器,从而传递被单击的项。这样,您就不会一直创建额外的对象。在对视图进行任何更改之前,还要检查标志和状态。
        viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
              Item item = getItem(getAdapterPosition());
              outsideClickListener.onItemClicked(item);
          }
    });
  1. 更改数据后,请尝试 仅更新受影响的项目 。例如notifyDataSetChanged(),当添加/加载更多项目时,不要使用来使整个数据集无效,而只需使用:
        adapter.notifyItemRangeInserted(rangeStart, rangeEnd);
    adapter.notifyItemRemoved(position);
    adapter.notifyItemChanged(position);
    adapter.notifyItemInserted(position);
  1. Android开发者网站

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

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

    adapter.setHasStableIds(true);

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

即使您做的一切正确,RecyclerView仍然可能无法达到您想要的平稳状态。

2020-09-09