复用命中流程图
RecyclerView中每层缓存有什么作用?
mChangedScrap
该层缓存目的是为了当调用notifyItemChanged(pos),notifyItemRangeChanged(pos,count)后该位置信息发生改变的缓存,一般用于change动画,注意mChangedScrap并不是说存储改变的位置并直接复用,而是在预布局时存储改变的holder,重新创建新holder并绑定数据来充当改变位置的数据刷新,然后根据新老holder执行change动画。动画执行完毕后新的holder会被缓存到mRecyclerPool中。那如何复用notifyItemChanged(pos)改变的holder呢?答案在 mAttachedScrap vs mChangedScrap中
mAttachedScrap
该层缓存目的是在调用notfyXxx时未改变的item,以及影响RecyclerView重新绘制的情况。
mChangedScrap和mAttachedScrap可以看做是一个层级,都是屏幕上可见itemView,只不过区分了状态(改变和未改变)。
mAttachedScrap vs mChangedScrap
Recycler 类中,我们可以看到两个单独的 scrap 容器: mAttachedScrap 和 mChangedScrap。为什么需要两个呢?
ViewHolder 只有在满足下面情况才会被添加到 mChangedScrap:当它关联的 item 发生了变化(notifyItemChanged 或者 notifyItemRangeChanged 被调用),并且 ItemAnimator 调用 ViewHolder#canReuseUpdatedViewHold