5.问题
一个RecyclerView,展示着多个item,每一个item又承载着一个RecyclerView,相当于RecylerView嵌套,我怎么实现里层RecyclerView中item的复用呢? 我用常规的写法,外层的能实现复用,里层的就没有复用 我们知道RV有四层的缓存机制
- mAttachedScrap 和 mChangedScrap:一级缓存。用于屏幕内item view快速重用,不需要重新createView和bindView
mAttachedScrap 和 mChangedScrap的区别:
- **mAttachedScrap:**表示未与RecyclerView分离的ViewHolder列表
- **mChangedScrap:**表示数据已经改变的viewHolder列表
- mCachedViews:二级缓存。当列表滑动出了屏幕时,ViewHolder会被缓存在 CachedViews ,其大小由ViewCacheMax决定,默认
**_DEFAULT_CACHE_SIZE_**
**_ _**为2,可通过**_Recyclerview.setItemViewCacheSize()_**
动态设置。保存最近移出屏幕的ViewHolder,包含数据和position信息,复用时必须是相同位置的ViewHolder才能复用,应用场景在那些需要来回滑动的列表中,当往回滑动时,能直接复用ViewHolder数据,不需要重新bindView。 - **ViewCacheExtension:三级缓存。**不直接使用,需要用户自定义实现,默认不实现。
- 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