RecyclerView缓存初识
RecyclerView
-
what is recyclerview ?
a flexible view for providing a limited window into a large data set
Recyclerview:
- Layout Manager
- Item Animator
- Adapter
what is viewHolder ?
public static class MyHolder extends RecyclerView.ViewHolder {
// 缓存view
protected SparseArray<View> views;
protected View mView;
private ViewDataBinding binding;
}
我们可以看到viewholder就是管理存储一个itemView中所有view的一个管理者。
recyclerview的缓存
scrap:一级缓存,其中放置着当前屏幕还在显示的itemview的holder,因为android屏幕每16ms刷新一次,会导致所有数据刷新,就直接复用scrap中的信息避免重新创建view以及bind view。通过position来达到复用的目的。
cache:二级缓存,其中存放着刚刚画出屏幕的itemview的holder,该缓存默认缓存大小为2,目的是当用户方向滑动的时候可以直接复用。
viewCacheExtension:三级缓存,留给用户自定义使用的缓存池
RecycledViewPool:四级缓存,一个新的itemview,如果在前三个缓存都不符合条件就从这里根据itemViewType来选择复用holder,不够这里边的holder是含有脏数据的,不需要调用oncreateView(),但是会重新绑定数据调用onBindView()。
RecyclerView的性能优化
点击事件的缓存,如果点击事件是放在onBindView()中进行设置的每次绑定数据的时候都要listener对象的创建与设置,这是没有必要的,而且在用户快速滑动的时候,资源的消耗就会特别明显。我们可以在oncreateView()中设置点击事件或者将点击事件放置在viewHolder中,在缓存viewHolder的时候同时将监听对象缓存起来。
recyclerView.setHasFixedSize()