0%

RecyclerView 的缓存机制

RecyclerView 就是继承的 ViewGroup 自定义的 View。

  • mChangeScrap (用于动画)与 mAttachedScrap(局部刷新) : 用来缓存还在屏幕的ViewHolder

  • mCachedViews : 屏幕之外的 ViewHolder,最多只能存 2 个,如果多了,则将 mCachedViews 中的一个移动到 RecycledViewPool中,然后把新的加进来(在复用的时候,连 onBinder 都不用调用,可以直接使用)

  • mViewCacheExtension: 开发者自己控制,系统未往里面添加数据

  • RecycledViewPool : 也是屏幕之外ViewHolder 缓存池,用 SpaseArray<viewType, ArrayList> 这种数据结构保存,ArrayList 的大小是 5 ,超出 5 个就会丢掉(复用这里面的 ViewHolder 需要调用 onBinder)

刷新的时候,可能 item 会闪一下,可以设置 stableId (设置为 true )来避免闪烁

如果上面几级缓存都没有拿到,那就 adapter 的 createViewHolder

分析RecyclerView 的缓存,要从其 onTouchEvent 入手,从这里开始滑动,然后处理滑动事件,以及拿 View 出来复用

源码分析

我们看它的 measure 、layout、draw

我们 measure 的时候都是考虑 padding 和 margin ,而 RecyclerView 还需要考虑 inset ,这个inset 就是 分割线,里面会根据各种 offset 来定空间

要确定自己绘制的分割线是在 itemView 的上层还是下层,这就有遮盖 itemView 或者被 itemView 遮盖的区别,如果是前者,就使用 onDrawOver, 如果是后者就在 onDraw 中绘制分割线

谢谢你的鼓励