Skip to content

Latest commit

 

History

History
36 lines (21 loc) · 1.84 KB

RecyclerView实现原理.md

File metadata and controls

36 lines (21 loc) · 1.84 KB

RecyclerView 的缓存机制

Recycler有4个层次用于缓存ViewHolder对象,优先级从高到底依次为ArrayList<ViewHolder> mAttachedScrapArrayList<ViewHolder> mCachedViewsViewCacheExtension mViewCacheExtensionRecycledViewPool mRecyclerPool。如果四层缓存都未命中,则重新创建并绑定ViewHolder对象

缓存性能:

缓存 重新创建ViewHolder 重新绑定数据
mAttachedScrap false false
mCachedViews false false
mRecyclerPool false true

缓存容量:

  • mAttachedScrap:没有大小限制,但最多包含屏幕可见表项。
  • mCachedViews:默认大小限制为2,放不下时,按照先进先出原则将最先进入的ViewHolder存入回收池以腾出空间。
  • mRecyclerPool:对ViewHolderviewType分类存储(通过SparseArray),同类ViewHolder存储在默认大小为5的ArrayList中。

缓存用途:

  • mAttachedScrap:用于布局过程中屏幕可见表项的回收和复用。
  • mCachedViews:用于移出屏幕表项的回收和复用,且只能用于指定位置的表项,有点像“回收池预备队列”,即总是先回收到mCachedViews,当它放不下的时候,按照先进先出原则将最先进入的ViewHolder存入回收池。
  • mRecyclerPool:用于移出屏幕表项的回收和复用,且只能用于指定viewType的表项
  1. 缓存结构:

    • mAttachedScrapArrayList<ViewHolder>
    • mCachedViewsArrayList<ViewHolder>
    • mRecyclerPool:对ViewHolderviewType分类存储在SparseArray<ScrapData>中,同类ViewHolder存储在ScrapData中的ArrayList

https://juejin.cn/post/6844903780006264845