RecycleView可优化的点

2021-10-06  本文已影响0人  半罐子晃
1.避免在onBind方法中创建对象

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

2.避免在onBind方法中做耗时操作,可采用逻辑前移或变成私有变量,比如:
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避免重新计算大小。

9.RecyclerView的新机制:预取(Prefetch)

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

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

猜你喜欢

热点阅读