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

尝试 Compose 方式
Jetpack Compose 是 Android 推荐的 UI 工具包。了解如何在 Compose 中使用布局。

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

修改布局

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

  • LinearLayoutManager:将项目排列在一维列表中。使用带有 LinearLayoutManagerRecyclerView 提供与 ListView 布局类似的功能。
  • GridLayoutManager:将项目排列成二维网格,就像棋盘上的方格一样。使用带有 GridLayoutManagerRecyclerView 提供与 GridView 布局类似的功能。
  • StaggeredGridLayoutManager:将项目排列成二维网格,每一列都稍微偏移前一列,就像美国国旗上的星星一样。

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

添加项目动画

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

启用列表项选择

recyclerview-selection 库允许用户使用触摸或鼠标输入在 RecyclerView 列表中选择项目。这使您可以保留对所选项目的视觉呈现的控制权。您还可以保留对控制选择行为的策略的控制权,例如哪些项目有资格选择以及可以选择多少个项目。

要将选择支持添加到 RecyclerView 实例,请执行以下步骤

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

    您可以使用三种键类型来标识选定的项目

    有关选择键类型的详细信息,请参阅 SelectionTracker.Builder

  2. 实现 ItemDetailsLookup
  3. ItemDetailsLookup 允许选择库访问有关 RecyclerView 项目的信息,前提是给定一个 MotionEvent。它实际上是 ItemDetails 实例的工厂,这些实例由 RecyclerView.ViewHolder 实例支持或从中提取。

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

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

    • onBindViewHolder() 中,调用 setActivated()(**不是** setSelected())在 View 对象上,使用 truefalse,具体取决于项目是否被选中。
    • 更新视图的样式以表示激活状态。我们建议使用 颜色状态列表资源 来配置样式。
  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 实例,您的应用必须提供与用于初始化 RecyclerViewRecyclerView.Adapter 相同的适配器,才能提供给 SelectionTracker.Builder。出于这个原因,在创建 SelectionTracker 实例后,将其注入到您的 RecyclerView.Adapter 中。否则,您将无法从 onBindViewHolder() 方法检查项目的选中状态。

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

其他资源

请参阅以下参考资料以获取更多信息。