RecyclerView优化方案

作者: Analyas | 来源:发表于2019-01-18 17:50 被阅读15次

    先上个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优化方案

        本文链接:https://www.haomeiwen.com/subject/ortodqtx.html