高级 RecyclerView 自定义 Android Jetpack 的一部分。

您可以自定义 RecyclerView 对象,以满足您的特定需求。使用 RecyclerView 创建动态列表中介绍的标准类提供了大多数开发者所需的全部功能;在许多情况下,您需要完成的自定义就是为每个 ViewHolder 设计视图,然后编写代码以使用适当的数据更新这些视图。不过,如果您的应用有特定要求,您也可以通过多种方式修改标准行为。本页将介绍您可以进行的一些其他自定义。

修改布局

RecyclerView 使用布局管理器将各个项放置在屏幕上,并确定何时重复使用不再对用户可见的项目视图。为了重复使用(或循环使用)视图,布局管理器可能会让 Adapter 使用数据集中的不同元素替换视图的内容。以这种方式循环使用视图可避免创建不必要的视图或执行代价高昂的 findViewById() 查找,从而提高性能。Android 支持库包含三个标准布局管理器,每个管理器都提供了许多自定义选项:

如果这些布局管理器都不符合您的需求,您可以通过扩展 RecyclerView.LayoutManager 抽象类来创建自己的布局管理器。

为列表项添加动画

每当某个项发生变化时,RecyclerView 都会使用 animator 来更改其外观。该 animator 是一个扩展抽象 RecyclerView.ItemAnimator 类的对象。默认情况下,RecyclerView 使用 DefaultItemAnimator 来提供动画。如果您想提供自定义动画,可以通过扩展 RecyclerView.ItemAnimator 来定义自己的 animator 对象。

启用列表项选择

借助 recyclerview-selection 库,用户可以通过触摸或鼠标输入来选择 RecyclerView 列表中的项。您仍然可以控制所选项的视觉呈现效果。您也仍然可以控制用于约束选择行为的政策,例如符合入选条件的项以及可以选择的项数。

如需为 RecyclerView 实例添加对选择操作的支持,请按以下步骤操作:

  1. 确定要使用的选择键类型,然后构建 ItemKeyProvider

    有三种键类型可供您标识所选项:Parcelable(以及所有子类,如 Uri)、StringLong。如需详细了解选择键类型,请参阅 SelectionTracker.Builder

  2. 实现 ItemDetailsLookup
  3. ItemDetailsLookup 使选择功能库能够访问给定 MotionEvent 对应的 RecyclerView 项的相关信息。它实际上是由 RecyclerView.ViewHolder 实例支持(或从中提取)的 ItemDetails 实例的工厂。

  4. 更新 RecyclerView 中的 Views 项,以反映用户已将其选中或取消选中。

    选择功能库不会为所选项提供默认视觉装饰。您必须在实现 onBindViewHolder() 时提供此设置。建议采用如下方法:

  5. 使用 ActionMode 为用户提供对所选项执行操作所需的工具。
  6. 注册 SelectionTracker.SelectionObserver 以在选择状态有变时接收通知。首次选择时,请启动 ActionMode 以向用户表示这一点,并提供特定于该选择的操作。例如,您可以向 ActionMode 栏添加删除按钮,然后将栏上的返回箭头连接到取消选择的操作。当选择列表变空时(如果用户取消选择最后一项),请不要忘记终止操作模式。

  7. 执行任何经过解释的次级操作
  8. 在事件处理流水线的最后,库可能会判断用户试图通过点按某个项来激活它或试图拖放某个项或一组选定项。请通过注册适当的监听器来回应这些解释。如需了解详情,请参阅 SelectionTracker.Builder

  9. 使用 SelectionTracker.Builder 汇编所有内容
  10. 以下示例演示了如何使用 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() 方法检查某个项的已选中状态。

  11. 将选中状态包含到 activity 生命周期事件中。
  12. 为了在不同的 activity 生命周期事件之间保留选中状态,您的应用必须分别从 activity 的 onSaveInstanceState()onRestoreInstanceState() 方法调用选择状态跟踪器的 onSaveInstanceState()onRestoreInstanceState() 方法。您的应用还必须向 SelectionTracker.Builder 构造函数提供唯一的选择 ID。此 ID 是必需的,因为 activity 或 fragment 可能具有多个不同的可选择列表,而所有这些列表都需要保持其已保存的状态。

    其他资源

    Sunflower 演示版应用中使用了 RecyclerView