美文网首页
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