RecycleView可优化的点

251 篇文章 4 订阅
33 篇文章 1 订阅

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卡顿的影响。



作者:半罐子晃
链接:https://www.jianshu.com/p/d8c8bc209688
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值