ListView复用及回收
AbsListView.RecycleBin
RecycleBin维护了两种类型列表
一种用于保存屏幕上可见的view,一种用于缓存滚动出屏幕的view
滚动时,子view完全滑出屏幕,保存在RecycleBin,子View进入屏幕,从RecycleBin中获取缓存view,进行数据绑定
RecyclerView 复用及回收
四级缓存机制
内部有Recycler内部类
onCreateViewHolder() onBindViewHolder()
复用机制
getViewForPosition(int position)
tryGetViewHolderForPositionByDeadline() Recycler的复用机制内部实现在这个方法里
mAttachedScrap 用于缓存显示在屏幕上的item的ViewHolder,场景是
mChangedScrap
mCachedViews 滑动中的回收和复用处理这个,可以直接添加到RecyclerView中显示,不需要重新onBindViewHolder
mCachedViews 的大小默认为2 . 遍历mCachedViews
mRecyclerPool 存放在这里的viewhodler的数据信息会被重置掉,所以需要重新调用onBindViewHolder来绑定数据
mViewCacheExtension 留给我们自己扩展的
mCachedViews 的大小默认为2 . 遍历mCachedViews
先判断mCacheView是否已经满了 如果已满会通过recycleCacheViewAt(0)把最老的放入RecyclerPool , 然后再把新的放进mCacheViews中,如果试图不符合条件就直接放进
RecyclerPool中.在进mCacheViews之前, 我们的视图只是被remove掉了,绑定的数据等信息还在.
复用逻辑在tryGetViewHolderForPositionByDeadLine()中
mState.isPreLayout() 为true 那么去mChageScrap中找holder (滑动过程中为false)
由LayoutManager 来遍历移除屏幕的viewholder ,回收时 都是把Viewholder放在mCacheViews里面,如果mCacheViews满了,那就在mCacheViews里找到下标为0最老的放入RecyclePool里
RecycleView滑动时,会交由LinearLayoutManager的scrollVerticallyBy()去处理, 然后LayoutManager会调用fill()方法去回收复用Viewholder
Recycler中每个viewtype的maxScrap默认为5 也就是每种viewholder的缓存容量为5
有个文章写得很好
https://www.jianshu.com/p/40820ea48457