2026-10-30 15:03:37
RecyclerView的回收复用机制通过缓存ViewHolder对象实现,回收发生在itemView不可见时,复用发生在itemView可见时,核心逻辑围绕滑动事件触发,结合四重缓存结构优化性能。具体机制如下:
回收与复用的核心对象
触发时机:当itemView因滑动移出屏幕(从可见变为不可见)时,RecyclerView在onTouchEvent的move事件中触发回收逻辑。具体流程为:
LayoutManager检测到itemView不可见;
调用Recycler的recycleViewHolderInternal()方法;
根据ViewHolder类型(如是否可复用、是否绑定数据)存入不同缓存层级。
四重缓存结构:
一级缓存(mCachedViews):默认容量为2,存储刚移出屏幕的ViewHolder,复用优先级最高。通过RecyclerView.setItemViewCacheSize()可调整容量。
二级缓存(mScrap与mAttachedScrap):mAttachedScrap存储仍在RecyclerView中但需要重新布局的ViewHolder(如动画中的视图);mScrap存储临时移除的视图,需手动调用addScrapView()添加。
三级缓存(mRecyclerPool):按viewType分类的缓存池,默认每个viewType容量为5。当一级/二级缓存不足时,从池中获取ViewHolder,需调用setRecycledViewPool()配置。
四级缓存(重建ViewHolder):若所有缓存均无法满足需求,则通过Adapter.onCreateViewHolder()创建新实例。
LayoutManager计算新itemView的位置和类型;
调用Recycler.getRecycledView()按优先级搜索缓存:
优先检查mCachedViews;
若未命中,检查mScrap或mAttachedScrap;
再未命中则从mRecyclerPool获取;
最终调用Adapter.onBindViewHolder()绑定数据。
若缓存均无可用ViewHolder,则执行Adapter.onCreateViewHolder()创建新实例。
