WHAT
RecyclerView 通过四级缓存池(Scrap → Cache → ViewCacheExtension → RecycledViewPool)复用 View,避免重复 inflate 和 findViewById,大幅降低列表滑动时的内存抖动与 GC 卡顿。
WHY
ListView 只有单级 convertView 复用,ViewType 多时容易出现 View 错位和 GC 频繁卡顿。RecyclerView 分离了布局与回收逻辑,不同 ViewType 各自拥有独立缓存,命中率更高,性能更稳定。
HOW
| 缓存层级 | 名称 | 默认容量 | 特点 |
|---|---|---|---|
| 一级 | mAttachedScrap | 无限制 | 屏幕内临时 detach,复用不触发 onBindViewHolder |
| 二级 | mCachedViews | 2 | 刚离屏的 View,携带数据,命中无需重新绑定 |
| 三级 | ViewCacheExtension | 自定义 | 开发者自行实现的扩展缓存 |
| 四级 | RecycledViewPool | 每类型5 | 多 RecyclerView 共享,需手动 setRecycledViewPool() |
实用调优技巧:
setItemViewCacheSize(n):增大二级 Cache 容量,减少重复绑定setHasStableIds(true):数据稳定时减少不必要的全量刷新- 嵌套列表(如 RecyclerView 嵌套):传入同一个 RecycledViewPool 实例,显著减少内存占用
- 搭配
DiffUtil精确刷新,避免 notifyDataSetChanged() 全量重绘