RecyclerView有4级缓存如下:
层级 | 缓存变量 | 缓存名 | 容量 | 数据结构 | 缓存用途 |
1 | mChangeScrap | 可见缓存 | x(无限制) | ArrayList | 用于屏幕中可见View的回收和复用 |
2 | mCachedViews | 缓存列表 | 2 | ArrayList | 用于移除屏幕的View的回收和复用,不会清空数据 |
3 | mViewCacheExtension | 自定义缓存 | x | 一般不使用这个 | |
4 | RecyclerViewPool | 缓存池 | 5 | SparseArray | 用于移除屏幕的View的回收和复用,会将ViewHolder的数据重置 |
一级缓存mChangeScrap,是来缓存当前屏幕中可见的View,当列表数据发生变化时,屏幕内的数据可以直接拿来复用。
这里二级缓存mCachedViews和四级缓存RecyclerViewPool,都是用来缓存移除屏幕的View。它们的区别在于,二级缓存mCachedViews只缓存移除屏幕的前2个View,当超过第3个View时,会把mCachedViews中的最先缓存的那个View移除掉(根据FIFO原则),并把它缓存到四级缓存RecyclerViewPool中去。保存在二级缓存mCachedViews的是携带了原来的ViewHolder的所有数据信息,数据可以直接来拿来复用。
从二级缓存mCachedViews里面移出的ViewHolder再存入四级缓存RecyclerViewPool之前<