android RecycledViewPool的作用详解
一、先明确基础概念
RecycledViewPool是什么?- 它是
RecyclerView的“缓存池”,专门存储那些“暂时用不到但可能后续复用”的ViewHolder。当ViewHolder从屏幕滑出,且超过mCachedViews(另一级缓存)的容量时,会被转移到这里“待命”。
- 它是
RecycledViewPool的默认容量是多少?- 它的容量是按
viewType划分的:默认情况下,每种viewType最多缓存 5 个ViewHolder。 - 例如:如果列表有 2 种
viewType(类型 0 和类型 1),那么缓存池会为类型 0 最多存 5 个,类型 1 最多存 5 个,总容量是 10 个(但按类型隔离)。
- 它的容量是按
viewType是什么?viewType是RecyclerView用来区分不同 Item 布局的标识(由getItemViewType()方法返回)。不同viewType的ViewHolder不能互相复用(因为布局不同)。例如:文本 Item(viewType=0)和图片 Item(viewType=1)的ViewHolder无法混用。
二、为什么会“频繁创建ViewHolder”?
核心原因是:RecycledViewPool 中对应 viewType 的缓存不够用了,导致每次需要显示新 Item 时,都得重新创建 ViewHolder(调用 onCreateViewHolder)。
举个例子:
假设你的列表有一个高频出现的 viewType=0(比如 100 个 Item 都是这个类型),而 RecycledViewPool 为 viewType=0 的默认容量是 5 个。
- 当快速滑动列表时,屏幕外会产生大量
viewType=0的ViewHolder,但缓存池最多只能存 5 个。 - 超过 5 个后,新滑出的
ViewHolder会被直接销毁(因为缓存池满了)。 - 当你往回滑时,需要重新显示这些
viewType=0的 Item,但缓存池里已经没有可用的了,只能重新创建ViewHolder,导致onCreateViewHolder频繁调用,引发卡顿。
三、viewType和缓存池容量的关系
RecycledViewPool 的容量是按 viewType 独立分配的,不同 viewType 的缓存互不干扰。这意味着:
- 如果某个
viewType的 Item 数量特别多(高频出现),但缓存池为它分配的默认容量(5 个)不够用,就会频繁创建新ViewHolder。 - 反之,如果某个
viewType的 Item 很少(低频出现),即使缓存池容量是 5 个,也可能用不完(不会浪费)。
例如:
- 列表有两种
viewType:viewType=0(90% 的 Item 都是它)和viewType=1(仅 10% 的 Item)。 - 默认情况下,两者各有 5 个缓存位。但
viewType=0的 Item 太多,5 个缓存根本不够,导致频繁创建;而viewType=1的 5 个缓存可能一直用不完。
四、为什么“调整RecycledViewPool容量”能解决问题?
当我们为高频出现的 viewType 增大缓存容量(比如从默认 5 个调到 10 个),意味着:
- 更多滑出屏幕的
ViewHolder能被存到缓存池里,而不是被销毁。 - 当再次需要显示该类型的 Item 时,能直接从缓存池里取到
ViewHolder复用,无需重新创建(减少onCreateViewHolder的调用)。
代码示例:
// 为高频出现的 viewType=0 扩容到 10 个缓存 recyclerView.getRecycledViewPool().setMaxRecycledViews(0, 10);
这样,viewType=0 的 ViewHolder 缓存容量从 5 变成 10,能容纳更多暂时不用的 ViewHolder,大幅降低创建新实例的频率。
总结
- 频繁创建
ViewHolder的原因:高频出现的viewType对应的缓存池容量不足(默认 5 个),导致滑出屏幕的ViewHolder被销毁,再次需要时只能重新创建。 RecycledViewPool默认容量:每种viewType最多缓存 5 个ViewHolder。- 与
viewType的关系:缓存池按viewType隔离,不同类型的ViewHolder不能复用,因此高频类型需要更大的缓存容量。
通过为高频 viewType 增大缓存池容量,能提升复用率,减少 ViewHolder 创建次数,优化列表滑动性能。
到此这篇关于android RecycledViewPool的作用的文章就介绍到这了,更多相关android recycledviewpool内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Android开发之TextView使用intent传递信息,实现注册界面功能示例
这篇文章主要介绍了Android开发之TextView使用intent传递信息,实现注册界面功能,涉及Android使用intent传值及界面布局等相关操作技巧,需要的朋友可以参考下2019-04-04
Android BottomNavigationView与Fragment重建与重叠问题解决方法探索
这篇文章主要介绍了Android BottomNavigationView与Fragment重建与重叠问题解决,总的来说这并不是一道难题,那为什么要拿出这道题介绍?拿出这道题真正想要传达的是解题的思路,以及不断优化探寻最优解的过程。希望通过这道题能给你带来一种解题优化的思路2023-01-01
创建Android库的方法及Android .aar文件用法小结
本文给大家介绍了创建Android库的方法及Android中 .aar文件生成方法与用法详解,涉及到创建库模块操作步骤及开发注意事项,需要的朋友参考下吧2017-12-12
Android刮刮乐效果-proterDuffXfermode的示例代码
这篇文章主要介绍了Android刮刮乐效果-proterDuffXfermode,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-12-12
Android7.0上某些PopuWindow出现显示位置不正确问题的解决方法
这篇文章主要介绍了Android7.0上某些PopuWindow出现显示位置不正确问题的解决方法,涉及针对Android7.0中PopuWindow属性与方法的相关设置技巧,需要的朋友可以参考下2017-10-10
Android编程基础之获取手机屏幕大小(DisplayMetrics应用)示例
这篇文章主要介绍了Android获取手机屏幕大小的方法,结合实例形式分析了TextView ,Button ,以及DisplayMetrics的使用方法,并重点分析了DisplayMetrics的应用技巧,需要的朋友可以参考下2016-10-10


最新评论