1、RecyclerView的缓存类
RecycleView的四级缓存是由三个类共同作用完成的,Recycler、RecycledViewPool和ViewCacheExtension。
2、Recycler
用于管理已经废弃或者与RecyclerView分离的ViewHolder,这里面有两个重要的成员:
- 屏幕内缓存:(一级缓存)
- 屏幕内缓存指:在屏幕中显示的ViewHolder,这些ViewHolder会缓存在mAttachedScrap、mChangedScrap中。
- mChangedScrap 表示数据已经改变的viewHolder列表,mAttachedScrap表示未与RecyclerView分离的(数据没改变过的)ViewHolder列表。
- 屏幕外缓存:(二级缓存)
- 当列表滑动出了屏幕时,ViewHolder会被缓存在 mCachedViews。
- mCachedViews大小由mViewCacheMax决定,默认DEFAULT_CACHE_SIZE为2,可通过Recyclerview.setItemViewCacheSize()动态设置。
- mCachedViews中的ViewHolder没有进行清理,ViewHolder相关的position,flag等标志都一并被缓存了,从mCachedViews中取出的ViewHolder不需要再进行绑定操作而可以直接使用。
3、ViewCacheExtension (三级缓存)
开发者可自定义的一层缓存,是虚拟类ViewCacheExtension的一个实例,开发者可实现方法getViewForPositionAndType(Recycler recycler, int position, int type)来实现自己的缓存。
4、RecycledViewPool(四级缓存)
- RecycledViewPool类是用来缓存ViewHolder,如果多个RecyclerView之间用setRecycledViewPool(RecycledViewPool)设置同一个RecycledViewPool,他们就可以共享ViewHolder。
- pool的大小默认为5。
- 不同viewType的viewHolder存在不同的list中。
- 从pool池中拿出来的viewholder是剥了层皮的(清除所有的position,flag等),需要重新绑定一次数据。
5、总结
四级缓存的流程是:屏幕内 -> 屏幕外 -> 用户自定义 -> pool池。