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功能探究
网友评论