高级 RecyclerView 自定义 Android Jetpack 的一部分。
您可以自定义 RecyclerView
对象,以满足您的特定需求。使用 RecyclerView 创建动态列表中介绍的标准类提供了大多数开发者所需的全部功能;在许多情况下,您需要完成的自定义就是为每个 ViewHolder 设计视图,然后编写代码以使用适当的数据更新这些视图。不过,如果您的应用有特定要求,您也可以通过多种方式修改标准行为。本页将介绍您可以进行的一些其他自定义。
修改布局
RecyclerView
使用布局管理器将各个项放置在屏幕上,并确定何时重复使用不再对用户可见的项目视图。为了重复使用(或循环使用)视图,布局管理器可能会让 Adapter 使用数据集中的不同元素替换视图的内容。以这种方式循环使用视图可避免创建不必要的视图或执行代价高昂的 findViewById()
查找,从而提高性能。Android 支持库包含三个标准布局管理器,每个管理器都提供了许多自定义选项:
LinearLayoutManager
将各个项排列在一维列表中。将RecyclerView
与LinearLayoutManager
搭配使用可提供类似于旧版ListView
布局的功能。GridLayoutManager
将各个项排列在二维网格中,就像棋盘上的方格一样。将RecyclerView
与GridLayoutManager
搭配使用可提供类似于旧版GridView
布局的功能。StaggeredGridLayoutManager
将各个项排列在二维网格中,每一列都在前一列基础上稍微偏移,就像美国国旗中的星星一样。
如果这些布局管理器都不符合您的需求,您可以通过扩展 RecyclerView.LayoutManager
抽象类来创建自己的布局管理器。
为列表项添加动画
每当某个项发生变化时,RecyclerView
都会使用 animator 来更改其外观。该 animator 是一个扩展抽象 RecyclerView.ItemAnimator
类的对象。默认情况下,RecyclerView
使用 DefaultItemAnimator
来提供动画。如果您想提供自定义动画,可以通过扩展 RecyclerView.ItemAnimator
来定义自己的 animator 对象。
启用列表项选择
借助 recyclerview-selection
库,用户可以通过触摸或鼠标输入来选择 RecyclerView
列表中的项。您仍然可以控制所选项的视觉呈现效果。您也仍然可以控制用于约束选择行为的政策,例如符合入选条件的项以及可以选择的项数。
如需为 RecyclerView
实例添加对选择操作的支持,请按以下步骤操作:
- 确定要使用的选择键类型,然后构建
ItemKeyProvider
。有三种键类型可供您标识所选项:
Parcelable
(以及所有子类,如Uri
)、String
和Long
。如需详细了解选择键类型,请参阅SelectionTracker.Builder
。 - 实现
ItemDetailsLookup
。 - 更新
RecyclerView
中的Views
项,以反映用户已将其选中或取消选中。选择功能库不会为所选项提供默认视觉装饰。您必须在实现
onBindViewHolder()
时提供此设置。建议采用如下方法:- 在
onBindViewHolder()
中,对View
对象调用setActivated()
(而不是setSelected()
)并传入true
或false
(具体取决于对应的项否处于选中状态)。 - 更新视图样式以表示已激活状态。我们建议您使用颜色状态列表资源来配置样式。
- 在
- 使用
ActionMode
为用户提供对所选项执行操作所需的工具。 - 执行任何经过解释的次级操作
- 使用
SelectionTracker.Builder
汇编所有内容 - 将选中状态包含到 activity 生命周期事件中。
ItemDetailsLookup
使选择功能库能够访问给定 MotionEvent
对应的 RecyclerView
项的相关信息。它实际上是由 RecyclerView.ViewHolder
实例支持(或从中提取)的 ItemDetails
实例的工厂。
注册 SelectionTracker.SelectionObserver
以在选择状态有变时接收通知。首次选择时,请启动 ActionMode
以向用户表示这一点,并提供特定于该选择的操作。例如,您可以向 ActionMode
栏添加删除按钮,然后将栏上的返回箭头连接到取消选择的操作。当选择列表变空时(如果用户取消选择最后一项),请不要忘记终止操作模式。
在事件处理流水线的最后,库可能会判断用户试图通过点按某个项来激活它或试图拖放某个项或一组选定项。请通过注册适当的监听器来回应这些解释。如需了解详情,请参阅 SelectionTracker.Builder
。
以下示例演示了如何使用 Long
选择键将这些部分组合在一起:
Kotlin
var tracker = SelectionTracker.Builder( "my-selection-id", recyclerView, StableIdKeyProvider(recyclerView), MyDetailsLookup(recyclerView), StorageStrategy.createLongStorage()) .withOnItemActivatedListener(myItemActivatedListener) .build()
Java
SelectionTracker tracker = new SelectionTracker.Builder<>( "my-selection-id", recyclerView, new StableIdKeyProvider(recyclerView), new MyDetailsLookup(recyclerView), StorageStrategy.createLongStorage()) .withOnItemActivatedListener(myItemActivatedListener) .build();
为了构建 SelectionTracker
实例,您的应用必须向 SelectionTracker.Builder
提供您之前初始化 RecyclerView
时所用的同一个 RecyclerView.Adapter
。因此,创建 RecyclerView.Adapter
后,您很可能需要在 SelectionTracker
实例一经创建后就将其注入到 RecyclerView.Adapter
中。否则,您将无法通过 onBindViewHolder()
方法检查某个项的已选中状态。
为了在不同的 activity 生命周期事件之间保留选中状态,您的应用必须分别从 activity 的 onSaveInstanceState()
和 onRestoreInstanceState()
方法调用选择状态跟踪器的 onSaveInstanceState()
和 onRestoreInstanceState()
方法。您的应用还必须向 SelectionTracker.Builder
构造函数提供唯一的选择 ID。此 ID 是必需的,因为 activity 或 fragment 可能具有多个不同的可选择列表,而所有这些列表都需要保持其已保存的状态。
其他资源
Sunflower 演示版应用中使用了 RecyclerView
。