自定义动态列表 Android Jetpack 的一部分。
您可以自定义 RecyclerView 对象,以满足您的特定需求。使用 RecyclerView 创建动态列表中介绍的标准类提供了大多数开发者所需的所有功能。在许多情况下,您只需为每个视图存储器设计视图,并编写代码以使用适当的数据更新这些视图。不过,如果您的应用有特定要求,您可以通过多种方式修改标准行为。本文档介绍了一些可能的自定义设置。
修改布局
RecyclerView 使用布局管理器在屏幕上定位各个列表项,并确定何时重复使用用户已看不到的列表项视图。为了重复使用(或回收)视图,布局管理器可能会要求适配器将视图内容替换为数据集中的其他元素。通过这种方式回收视图,可以避免创建不必要的视图或执行开销高昂的 findViewById() 查找,从而提高性能。Android 支持库包含三个标准布局管理器,每个管理器都提供了许多自定义选项:
LinearLayoutManager:将各项排列在一维列表中。将RecyclerView与LinearLayoutManager搭配使用可提供类似于ListView布局的功能。GridLayoutManager:将各项排列在二维网格中,就像棋盘上的方格一样。将RecyclerView与GridLayoutManager搭配使用可提供类似于GridView布局的功能。StaggeredGridLayoutManager:将项目排列在二维网格中,每列与前一列略有偏移,就像美国国旗上的星星一样。
如果这些布局管理器不符合您的需求,您可以通过扩展 RecyclerView.LayoutManager 抽象类来创建自己的布局管理器。
为列表项添加动画
每当内容发生变化时,RecyclerView 都会使用动画程序来更改其外观。此 Animator 是一个扩展抽象 RecyclerView.ItemAnimator 类的对象。默认情况下,RecyclerView 使用 DefaultItemAnimator 提供动画。如果您想提供自定义动画,可以通过扩展 RecyclerView.ItemAnimator 来定义自己的动画程序对象。
启用列表项选择
recyclerview-selection 库可让用户使用轻触或鼠标输入在 RecyclerView 列表中选择内容。这样,您就可以控制所选项的视觉呈现。您还可以继续控制用于控制选择行为的政策,例如哪些内容符合选择条件以及可以选择多少内容。
如需向 RecyclerView 实例添加选择支持,请按以下步骤操作:
- 确定要使用的选择键类型,然后构建
ItemKeyProvider。您可以使用三种键类型来标识所选项:
Parcelable及其子类,例如UriStringLong
如需详细了解选择键类型,请参阅
SelectionTracker.Builder。 - 实现
ItemDetailsLookup。 - 更新
RecyclerView中的项View对象,以反映用户是选择还是取消选择这些对象。选择库不为所选项提供默认视觉修饰。在实现
onBindViewHolder()时提供此信息。 我们建议您采用以下方法:- 在
onBindViewHolder()中,根据是否选择了该项,使用true或false对View对象调用setActivated()(而非setSelected())。 - 更新视图样式以表示已激活状态。我们建议您使用颜色状态列表资源来配置样式。
- 在
- 使用
ActionMode为用户提供对所选内容执行操作的工具。 - 执行任何经过解读的次要操作。
- 使用
SelectionTracker.Builder组装所有内容。 - 在 activity 生命周期事件中包含选择。
ItemDetailsLookup 允许选择库在给定 MotionEvent 的情况下访问 RecyclerView 项的相关信息。
它实际上是一个工厂,用于生成由 RecyclerView.ViewHolder 实例备份或从中提取的 ItemDetails 实例。
注册 SelectionTracker.SelectionObserver,以便在选择发生变化时收到通知。首次创建选区时,启动 ActionMode 以向用户显示此选区并提供特定于选区的操作。例如,您可以向 ActionMode 栏添加一个删除按钮,并将该栏上的返回箭头连接到清除所选内容的操作。当所选内容变为空时(如果用户最后一次清除了所选内容),终止操作模式。
在事件处理流水线的末尾,库可能会确定用户正在尝试通过点按来激活某个项,或者正在尝试拖动某个项或一组选定项。请通过注册适当的监听器来回应这些解释。如需了解详情,请参阅 SelectionTracker.Builder。
以下示例展示了如何将这些部分组合在一起:
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。因此,在创建 SelectionTracker 实例后,请将其注入到 RecyclerView.Adapter 中。否则,您无法通过 onBindViewHolder() 方法检查项的选中状态。
如需在 activity 生命周期事件中保留选择状态,您的应用必须分别从 activity 的 onSaveInstanceState() 和 onRestoreInstanceState() 方法中调用选择跟踪器的 onSaveInstanceState() 和 onRestoreInstanceState() 方法。您的应用还必须向 SelectionTracker.Builder 构造函数提供唯一的选择 ID。此 ID 是必需的,因为一个 activity 或 fragment 可能有多个不同的可选列表,所有这些列表都需要在其保存的状态中保留。
其他资源
如需了解详情,请参阅以下参考文档。
- Sunflower 演示版应用,该应用使用
RecyclerView。 - 使用 RecyclerView 显示可滚动列表 Codelab。
- Android Kotlin 基础知识:RecyclerView 基础知识 Codelab。