入口
我们从使用功能上去读取源码,通常的用法是这个样子
-> 我们设置layoutmanager,GridLayouManager 继承LinearLayoutManager,所以我们就LinearLayoutManager 为基准查看
rv.layoutManager = GridLayoutManager(this,5)
rv.addItemDecoration(DividerItemDecoration(this,LinearLayout.VERTICAL))
-> kotlin 写法给数据源
var result: List = (1..1000).map { it.toString() }
rv.adapter = CustomAdapter(this, result as MutableList)
recycler.png
看复用机制的话,我们从滑动看起。
滑动的处理时间,一般就在onTouchEvent 的 MotionEvent.Move事件看起
入口:滑动 Move 事件 --> scrollByInternal --> scrollStep --> mLayout.scrollVerticallyBy (RecyclerView 用了模板方法默认返回0,所以我们看他的实现方法在LineaLayoutManager里面找)
--> scrollBy -->(consumed) fill --> (while循环)layoutChunk --> layoutState.next --> addView(view);
layoutState.next --> getViewForPosition --> tryGetViewHolderForPositionByDeadline -->
tryGetViewHolderForPositionByDeadline 和缓存分析
怎么从集合中去获取:tryGetViewHolderForPositionByDeadline,分几种情况去获取ViewHolder
getChangedScrapViewForPosition -- mChangeScrap 与动画相关
getScrapOrHiddenOrCachedHolderForPosition -- mAttachedScrap 、mCachedViews
getScrapOrCachedViewForId -- mAttachedScrap 、mCachedViews (ViewType,itemid)
mViewCacheExtension.getViewForPositionAndType -- 自定义缓存 -- (使用情况:局部刷新??)
getRecycledViewPool().getRecycledView -- 从缓冲池里面获取
RecycledViewPool -- 缓存池
ViewHolder -- 包装View的 --- ItemView
当没有缓存的时候??--- mAdapter.createViewHolder --》 onCreateViewHolder
多级缓存的目的 -- 为了性能
创建ViewHolder 后 绑定: tryBindViewHolderByDeadline--》 mAdapter.bindViewHolder--》onBindViewHolder
回收机制,缓存机制
回收(缓存)机制:看这一个情况--- ViewHolder
LinearLayoutManager.onLayoutChildren --> detachAndScrapAttachedViews --> scrapOrRecycleView
--> 1.recycler.recycleViewHolderInternal(viewHolder); -- 处理 CacheView 、RecyclerViewPool 的缓存
--> 1.ViewHodler改变 不会进来 -- 先判断mCachedViews的大小
--> mCachedViews.size 大于默认大小 --- recycleCachedViewAt
--- >addViewHolderToRecycledViewPool --- 缓存池里面的数据都是从mCachedViews里面出来的
--> 2.addViewHolderToRecycledViewPool --> getRecycledViewPool().putRecycledView(holder);
--> scrap.resetInternal(); ViewHolder 清空
--> 2.recycler.scrapView(view);
recycler_cache.png
mCachedViews当前的大小 如果 大于等于mViewCacheMax(默认的CachedViews的大小)
ViewType --
缓存池 里面保存 只是 ViewHolder 类型 没有数据
去查找缓存和复用的一种情况
入口:复用:RecyclerView.onLayout --> dispatchLayout --》 dispatchLayoutStep2 --》 onLayoutChildren --》 fill
缓存:fill -->recycleByLayoutState-->recycleViewsFromStart --> recycleChildren
--> removeAndRecycleViewAt --> recycler.recycleView
--> recycler.recycleViewHolderInternal(viewHolder); -- 处理 CacheView 、RecyclerViewPool 的缓存