1RecyclerView是 Android 显示可滚动列表/网格的现代组件。它将数据与显示分离,使用Adapter提供数据,ViewHolder提高重用效率,LayoutManager控制布局。RecyclerView的关键目标是 高效回收与复用视图以减少内存与布局开销。
核心角色:
RecyclerView:容器视图,负责触发创建、绑定与回收行为Adapter:把数据映射成视图(create/bind)ViewHolder:持有 item 的 View 引用,避免频繁 findViewByIdLayoutManager:决定 item 如何排列(线性、网格、瀑布流或自定义)ItemDecoration:控制分割线、间距、悬浮头等视觉装饰ItemAnimator:控制增删改动时的动画
onCreateViewHolder什么时候调用?
RecyclerView的核心优势之一是它通过回收和重用视图来高效地处理列表。但在一开始或者当列表滚动到需要显示一种新型的项目视图,并且当前没有可重用的ViewHolder时,它就需要一个新的容器。
onCreateViewHolder()的作用正是:
- 创建并初始化用于显示列表项的 View
- 将这个 View 包裹在一个新的
ViewHolder对象中 - 将创建好的
ViewHolder返回给RecyclerView
这里的 view 和 item 样式有本质区别:
onCreateViewHolder()调用的核心判断标准是 Item 的类型View Type)
调用时机
- 首次加载列表时: 列表需要填充屏幕和预取一些视图时会调用。
- 需要新的视图类型时: 当列表滚动到需要显示一种不同布局类型(如果有多种 itemViewType)的项目,并且没有可重用的
ViewHolder时。 - 没有可重用的 ViewHolder 时: 当列表滚动,需要一个新的视图来显示新的数据,但在可回收池中找不到合适类型的
ViewHolder来重用时。
简而言之:
每当
RecyclerView布局管理器确定需要一个新的、尚未创建的ViewHolder来显示屏幕上的项目时,就会调用它。
触发机制
- 初始化与填充屏幕: 当你第一次设置
Adapter并将LayoutManager附加到RecyclerView时,LayoutManager会计算需要显示多少个 Item 才能填满屏幕。- 例如,屏幕能显示 6 个 Item。
LayoutManager就会请求Adapter创建 6 个ViewHolder。此时会调用 6 次onCreateViewHolder。
- 例如,屏幕能显示 6 个 Item。
- 滚动时需要新类型: 当用户滚动列表,新的 Item 即将进入屏幕时:
LayoutManager会首先检查缓存池(RecycledViewPool)。- 如果缓存池中有相同
View Type的、被滑出屏幕的ViewHolder,它就会重用这个ViewHolder,并调用onBindViewHolder更新数据。此时不会调用onCreateViewHolder。 - 如果缓存池中没有相同
View Type的可用ViewHolder(例如,列表首次滚动到一种新的、不同的布局类型),LayoutManager就会向Adapter请求创建一个新的。此时onCreateViewHolder就会被调用。
调用顺序
- getItemCount()
- 在初始化阶段调用,RecyclerView 需要知道总共有多少项
- 对于每个需要显示的项目,按以下顺序调用:
a. getItemViewType(position)
- 首先确定该位置项目的视图类型
b. onCreateViewHolder(parent, viewType)
- 根据上一步确定的 viewType 创建相应的 ViewHolder
- 只有当没有可重用的相同类型的 ViewHolder 时才会调用此方法
c. onBindViewHolder(holder, position)
- 最后调用,将数据绑定到 ViewHolder 上
- 对每个可见项都会调用,即使是重用的 ViewHolder
更新: 2025-12-12 09:59:03
原文: https://www.yuque.com/dongpozhouzi-mshe3/zhm85g/iyleghtvg4gt1tsg