计算机领域常用的提高效率办法是使用缓存,一级不够就上多级缓存,RecyclerView也采用了缓存策略。缓存的单位是ViewHolder,具体实现是Recycler类,Recycler有五个缓存池用来存放暂时用不到的ViewHolder,下一次使用时会在缓存池中寻找,找不到时才会调用Adapter的onCreateViewHolder创建ViewHolder。加上ChildHelper的mHiddenViews共六个缓存池如下:
mChangedScrap | 在预布局阶段,如果ViewHolder数据有变化,会被LayoutManager的onLayoutChildren方法中的detachAndScrapAttachedViews存入mChangedScrap |
mAttachedScrap | 在预布局阶段,如果ViewHolder数据没有变化,会被存入mAttachedScrap,在布局阶段也会被存入,方法和mChangedScarp是同一个 |
mCachedViews | ViewHolder不需要了,例如被滑出屏幕,会被回收到mCachedViews,mCachedViews大小有限制,空间满了,会按照最近最少使用原则移动一个到mRecyclerPool |
mViewCacheExtension | 自定义的缓存池,一般用不到 |
mRecyclerPool | 当mCachedViews存不下时会移动旧的viewHolder到这里来,和上面所有缓存池最大的区别是mRecyclerPool中的viewHolder是没有数据的,必须调用Adapter的onBindViewHolder重新绑定 |
mUnmodifiableAttachedScrap | mAttachedScrap的不可修改版本,用于处理被挤出屏幕的view的动画,在布局流程下中有分析 |
mHiddenViews | 和上面的都不同,mHiddenViews是Chi |