Skip to content

问题

一个RecyclerView,展示着多个item,每一个item又承载着一个RecyclerView,相当于RecylerView嵌套,我怎么实现里层RecyclerView中item的复用呢? 我用常规的写法,外层的能实现复用,里层的就没有复用 43eca7ad8b69deb6400ca22a49606a18.pngb9ada20bf986644c519f2e4138bfdf2c.png 我们知道RV有四层的缓存机制

  1. mAttachedScrap 和 mChangedScrap:一级缓存。用于屏幕内item view快速重用,不需要重新createView和bindView

mAttachedScrap 和 mChangedScrap的区别:

  1. **mAttachedScrap:**表示未与RecyclerView分离的ViewHolder列表
  2. **mChangedScrap:**表示数据已经改变的viewHolder列表
  1. mCachedViews:二级缓存。当列表滑动出了屏幕时,ViewHolder会被缓存在 CachedViews ,其大小由ViewCacheMax决定,默认**_DEFAULT_CACHE_SIZE_****_ _**为2,可通过**_Recyclerview.setItemViewCacheSize()_**动态设置。保存最近移出屏幕的ViewHolder,包含数据和position信息,复用时必须是相同位置的ViewHolder才能复用,应用场景在那些需要来回滑动的列表中,当往回滑动时,能直接复用ViewHolder数据,不需要重新bindView。
  2. **ViewCacheExtension:三级缓存。**不直接使用,需要用户自定义实现,默认不实现。
  3. RecycledViewPool:四级缓存。当cacheView满了后或者adapter被更换,将cacheView中移出的ViewHolder放到Pool中,放之前会把ViewHolder数据清除掉,所以复用时需要重新bindView。

因此根据上面的缓存机制,要显示一个item时可以分为三种情况

  • 最坏情况:重新创建ViewHodler并重新绑定数据
  • 次好情况:复用ViewHolder但重新绑定数据
  • 最好情况:复用ViewHolder且不重新绑定数据

而我们的外层Item里面是一个RV,那么里层的RV都各自维护着自身的缓存池,那么不同的外层item上展示的里层item之间是不能相互复用的,所以我们只需要指定里层的所有RV都是同一个四级缓存池,这样就可以使用次好情况来复用item 外层item上包裹的里层的RV,都维护着自身的缓存池,所以只需要在外层的Adapter设置一个共用的RecyclerPool给里层的RV,就可以实现里层的RV都会从同一个池子里获取缓存的item。https://blog.csdn.net/fei20121106/article/details/98876230