美文网首页
RecycleView可优化的点

RecycleView可优化的点

作者: 半罐子晃 | 来源:发表于2021-10-06 22:40 被阅读0次
1.避免在onBind方法中创建对象

因为onBind方法的调用时机是View滑到屏幕内可显示时这个方法就会调用此方法,避免在这个方法内设置点击事件等创建对象的操作。

2.避免在onBind方法中做耗时操作,可采用逻辑前移或变成私有变量,比如:
  • 1.TextView.setText(Html.fromHtml(str);
  • 2.计算UI的宽高比,margin,padding,每次都用DensityUtils.dp2px()转换。
  • 3.每次都new一些可以复用都对象:adapter,viewparam
3.通过RecyclerPool给RecycleView设置缓存池实现多个RecycleView复用。

多用于RecycleView嵌套RecycleView,减少对ViewHolder的创建

//缓存池
private RecyclerView.RecycledViewPool childPool;
public XXAdapter(){
    childPool = new RecyclerView.RecycledViewPool();
}
private class RcyViewHolder extends RecyclerView.ViewHolder {
        private SRecyclerView sRcy;

        public RcyViewHolder(View itemView) {
            super(itemView);
            sRcy = itemView.findViewById(R.id.rcy_child);
            LinearLayoutManager manager = new LinearLayoutManager(mContext);
            //1.设置回收
            manager.setRecycleChildrenOnDetach(true);
            manager.setOrientation(LinearLayoutManager.HORIZONTAL);
            sRcy.setLayoutManager(manager);
            //2.设置缓存Pool
            sRcy.setRecycledViewPool(childPool);
        }
    }
4.需要大量加载图片的列表或是复杂布局,重写onScroll事件,滑动停止后再加载图片或布局或采用「骨架屏」框架方案。
5.灵活应用刷新机制,减少没必要的绑定方法的调用。

notifydatasetchange全部刷新,notifyItemRemoved(0)局部删除, notifyItemRangeInserted(start,end)等刷新机制的选择。

6.减少层级绘制
7.设置setItemViewCacheSize缓存大小
recyclerView.setItemViewCacheSize(20);
recyclerView.setDrawingCacheEnabled(true);
recyclerView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);

其实setItemViewCacheSize设置的是CacheViews的大小

1.CacheViews中的缓存只能position相同才能复用,并且不会重新Bind.
2.CacheViews满了后会移除到RecyclerPool中,并重置ViewHolder.
3.RecyclerPool中的缓存复用需要重新Bind.

所以我们可以适当的通过调用setItemViewCacheSize方法,来增加CacheViews的大小(默认是2),来防止小范围的滑动导致的重复Bind而导致的卡顿。典型的拿空间还时间,所以要考虑内存问题,根据自己的应用实际情况设置大小

8.recyclerView.setHasFixedSize(true)避免重新计算item高度。

当知道Adapter内Item的改变不会影响RecyclerView宽高的时候,可以设置为true让RecyclerView避免重新计算大小。

  • onItemRangeChanged()
  • onItemRangeInserted()
  • onItemRangeRemoved()
  • onItemRangeMoved()
    当调用Adapter的增删改插方法,最后就会根据mHasFixedSize这个值来判断需要不需要requestLayout();所以这4个方法不会重新绘制。
    当执行notifyDataSetChanged()时,最后调用了onChanged,调用了requestLayout(),会去重新测量宽高,所以我们设置为true时,大小还是重新计算。
9.RecyclerView的新机制:预取(Prefetch)

需要升级Recycle版本到25以上的版本才能使用recyclerview prefetch功能。
参考文章:RecyclerView的新机制:预取(Prefetch)
RecyclerView Prefetch功能探究

10.合理的复用onBind方法,对性能进行检测,观察比较复用后对UI卡顿的影响。

相关文章

网友评论

      本文标题:RecycleView可优化的点

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