目录
1.RecyclerView的多级缓存机制
1.1 四级缓存层次
1.2 每一级缓存具体作用及具体场景
mAttachedScrap:
作用:已添加item与被删除item的 临时存储空间
场景:RecyclerView滚动时、删除Item后用
notifyItemRemoved通知更新
mChangedScrap:
作用:存放可见范围更新的Item
场景:1、可见范围内的Item有更新,并且使用
notifyItemChanged
方法通知更新时;2、播放动画(播放完viewholder会交给RecycledViewPool)
mCachedViews:
作用:滚动过程中,存放未被重新使用且状态无变化的Item
场景:1、滚动过程
2、perfetch(prefetch机制是RecyclerView滚动时借助Handler来事先从RecycledViewPool中取出即将要显示的Item,随即扔到
mCachedViews
)
ViewCacheExtension
作用:是一个可选的缓存层,允许自定义缓存策略,存储更多的或者特定类型ViewHolders
RecyclerdViewPool
作用:缓存Item的最终站,
保存Removed、Changed、以及mCachedViews满了之后更旧的Item
场景:Item被移除、Item有更新、滚动过程
1.3 二级缓存论
mCachedViews 一级缓存:
ViewHolder数据还在,只有原来的position可用,不需要重新绑定数据
且 mCachedViews 默认大小为 2RecycledViewPool 二级缓存:
ViewHolder数据重置,需要重新绑定数据
RecycledViewPool 根据不同的 item type 创建不同的 List,每个 List 默认大小为 5
复用时,只要 RecycledViewPool 中对应 type 的 List 有 ViewHolder 缓存,最后一个拿出来复用
1.4 Item状态
四种:INVALID、REMOVED、UPDATE、POSITION_UNKNOWN
状态未变——》存放mCachedViews
状态更新——》存放RecyclerdViewPool
1.5 四种对Item回收和布局的操作
0. 滚动 :Item布局完成之后,会对刚刚没有再次布局的Item进行缓存回收,这个缓存分两种:
即将重用,Recycler.
mCachedViews
来保管取出后会回调
onBindViewHolder,
RecycledViewPool来保管
Inserted:如果刚好插入在屏幕可见范围内,会从RecycledViewPool中找一个相同类型的ViewHolder 来重新绑定数据并layout;
Removed:会把对应ViewHolder扔到
mAttachedScrap
中并播放动画,动画播放完毕后移到RecycledViewPool里;Changed:先把旧的ViewHolder扔
mChangedScrap
中,然后像Inserted那样从RecycledViewPool中找一个相同类型的ViewHolder来重新绑定数据。旧ViewHolder用来播放动画,播完同样会移到RecycledViewPool里。
2.核心组件
Adapter->提供ViewHolder和绑定视图数据,如notifyItemChanged(int position)
ViewHolder->作为每个视图的容器
ItemAnimator->局部更新发生时,RecyclerView会利用ItemAnimator来添加、移除或更新项的动画效果
LayoutManager->Item的布局和回收
3.RecyclerView性能优化
3.1 局部更新数据
通过
notifyItemChanged(int position)
等方法进行局部数据更新,而不是使用
notifyDataSetChanged()
刷新整个列表,这减少了RecyclerView的重新布局次数
3.2 优化列表滑动
通过自定义
ItemDecoration
、ItemAnimator
以及合理使用LayoutManager
的特性来优化列表的滑动和动画效果,减少卡顿现象。
3.3 预加载数据
当用户滑动接近列表底部时,提前加载更多的数据,
以避免到达列表末尾时出现明显的加载等待时间