自定义动态列表 Android Jetpack 的一部分。

试用 Compose 方式
Jetpack Compose 是推荐在 Android 设备上使用的界面工具包。了解如何在 Compose 中使用布局。

您可以自定义 RecyclerView 对象,以满足您的特定需求。使用 RecyclerView 创建动态列表中介绍的标准类提供了大多数开发者需要的所有功能。在许多情况下,您只需为每个 ViewHolder 设计视图,并编写代码以使用适当的数据更新这些视图即可。不过,如果您的应用有特定要求,您可以通过多种方式修改标准行为。本文档介绍了一些可能的自定义设置。

修改布局

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

  • LinearLayoutManager:将项排列在一维列表中。将 RecyclerViewLinearLayoutManager 结合使用可提供类似于 ListView 布局的功能。
  • GridLayoutManager:将各个项排列在二维网格中,就像棋盘上的方格一样。将 RecyclerViewGridLayoutManager 结合使用可提供类似于 GridView 布局的功能。
  • StaggeredGridLayoutManager:将各项内容排列在二维网格中,每一列都与前一列略有偏移,就像美国国旗上的星星一样。

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

为列表项添加动画

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

启用列表项选择

借助 recyclerview-selection 库,用户可以使用轻触或鼠标输入选择 RecyclerView 列表中的项。这样,您就可以保留对所选项的视觉呈现的控制。您还可以保留对控制选择行为的政策的控制权,例如哪些项符合选择条件以及可以选择的项数。

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

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

    您可以使用以下三种密钥类型来识别所选项:

    如需详细了解选择键类型,请参阅 SelectionTracker.Builder

  2. 实现 ItemDetailsLookup
  3. ItemDetailsLookup 允许选择库访问给定 MotionEvent 下的 RecyclerView 项的相关信息。它实际上是由 RecyclerView.ViewHolder 实例备份或从 RecyclerView.ViewHolder 实例中提取的 ItemDetails 实例的工厂。

  4. 更新 RecyclerView 中的项 View 对象,以反映用户是选择还是取消选择它们。

    选择库不会为所选项提供默认视觉装饰。在实现 onBindViewHolder() 时提供此属性。 我们建议您采用以下方法:

    • onBindViewHolder() 中,使用 truefalseView 对象调用 setActivated()而不是 setSelected()),具体取决于相应项是否处于选中状态。
    • 更新视图样式以表示已激活状态。我们建议使用颜色状态列表资源来配置样式。
  5. 使用 ActionMode 为用户提供用于对所选内容执行操作的工具。
  6. 注册 SelectionTracker.SelectionObserver,以便在选择发生变化时收到通知。首次创建选择时,请启动 ActionMode 以将其呈现给用户,并提供特定于该选择的操作。例如,您可以向 ActionMode 栏添加一个删除按钮,然后在栏上连接返回箭头以清除选择。选择项为空时(如果用户上次清除了选择项),会终止操作模式。

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

  9. 使用 SelectionTracker.Builder 汇编所有内容。
  10. 以下示例展示了如何将这些部分组合在一起:

    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 实例,您的应用必须提供用于将 RecyclerView 初始化为 SelectionTracker.Builder 的同一 RecyclerView.Adapter。因此,在创建 SelectionTracker 实例后,请将其注入到 RecyclerView.Adapter 中。否则,您无法通过 onBindViewHolder() 方法检查某项的“已选择”状态。

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

其他资源

如需了解详情,请参阅以下参考文档。