0
点赞
收藏
分享

微信扫一扫

RecyclerView 源码四级缓存原理

入口

我们从使用功能上去读取源码,通常的用法是这个样子

  -> 我们设置layoutmanager,GridLayouManager 继承LinearLayoutManager,所以我们就LinearLayoutManager  为基准查看
rv.layoutManager = GridLayoutManager(this,5)
rv.addItemDecoration(DividerItemDecoration(this,LinearLayout.VERTICAL))
-> kotlin 写法给数据源
var result: List<String> = (1..1000).map { it.toString() }

rv.adapter = CustomAdapter(this, result as MutableList<String>)

看复用机制的话,我们从滑动看起。
滑动的处理时间,一般就在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

  1. getChangedScrapViewForPosition -- mChangeScrap 与动画相关
  2. getScrapOrHiddenOrCachedHolderForPosition -- mAttachedScrap 、mCachedViews
  3. getScrapOrCachedViewForId -- mAttachedScrap 、mCachedViews (ViewType,itemid)
  4. mViewCacheExtension.getViewForPositionAndType -- 自定义缓存 -- (使用情况:局部刷新??)
  5. 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);

mCachedViews当前的大小 如果 大于等于mViewCacheMax(默认的CachedViews的大小)

ViewType --

缓存池 里面保存 只是 ViewHolder 类型 没有数据

去查找缓存和复用的一种情况

入口:复用:RecyclerView.onLayout --> dispatchLayout --》 dispatchLayoutStep2 --》 onLayoutChildren --》 fill

缓存:fill -->recycleByLayoutState-->recycleViewsFromStart --> recycleChildren
--> removeAndRecycleViewAt --> recycler.recycleView
--> recycler.recycleViewHolderInternal(viewHolder); -- 处理 CacheView 、RecyclerViewPool 的缓存

ItemTouchHelper源码分析

举报

相关推荐

0 条评论