RecyclerView.setItemViewCacheSize与RecycledViewPool.setMaxRecycledViews的区别及优先级疑问
关于RecyclerView的setItemViewCacheSize和setMaxRecycledViews的区别与复用优先级
嘿,这个问题问得特别到位——刚接触RecyclerView缓存机制的开发者几乎都会被这俩方法搞懵,我来给你拆解清楚:
一、两者的核心区别
它们确实都是缓存,但分属RecyclerView缓存体系的不同层级,作用范围和缓存状态完全不一样:
1. setItemViewCacheSize(int size)
- 这是RecyclerView的本地一级缓存(View Cache),只属于当前RecyclerView,不能被其他RecyclerView共享。
- 它控制的是:当列表滚动时,那些刚滚出屏幕的ViewHolder,在被移到全局的RecycledViewPool之前,会先在这个本地缓存里保留多少个。
- 缓存里的ViewHolder是保留了原有数据状态的(比如输入框的文字、控件的选中状态),复用的时候直接拿来用,不需要重新调用
onBindViewHolder(),性能最优。
2. setMaxRecycledViews(int viewType, int max)
- 这是控制**全局二级缓存(RecycledViewPool)**的,这个池可以被多个RecyclerView共享(比如ViewPager里的多个同类型列表)。
- 它针对每种
viewType设置池子里能保留的最大ViewHolder数量,超出数量的话,最久未被使用的ViewHolder会被系统回收销毁。 - 池子里的ViewHolder是已经解绑了数据的,复用的时候必须重新调用
onBindViewHolder()来填充新数据。
二、ViewHolder的获取优先级
当RecyclerView需要新的ViewHolder时,会按以下顺序查找:
- 第一步:优先从自身的View Cache(
setItemViewCacheSize控制的缓存)中查找同viewType的ViewHolder,找到直接复用,无需重新绑定数据; - 第二步:如果View Cache里没有,就去RecycledViewPool里找同类型的ViewHolder,找到后需要重新绑定数据;
- 第三步:如果以上两个缓存都没有匹配的,才会调用
onCreateViewHolder()创建全新的ViewHolder。
小补充
- 如果你的列表项有很多需要保留的状态(比如带输入框的表单列表),可以适当调大
setItemViewCacheSize,避免滚动时状态丢失; - 如果有多个同布局的RecyclerView(比如底部导航栏切换的几个列表),共用一个RecycledViewPool并合理设置
setMaxRecycledViews,能有效减少内存占用和ViewHolder的创建次数。
内容的提问来源于stack exchange,提问作者Sid Go
相关产品推荐
相关产品推荐

