自定义动态列表 Android Jetpack 的一部分。
您可以自定义 RecyclerView
对象,以满足您的特定需求。使用 RecyclerView 创建动态列表中介绍的标准类提供了大多数开发者需要的所有功能。在很多情况下,您只需为每个 ViewHolder 设计视图,然后编写代码以使用适当的数据更新这些视图。不过,如果您的应用有特定要求,您也可以通过多种方式修改标准行为。本文档介绍了一些可能的自定义。
修改布局
RecyclerView
使用布局管理器将各项内容放置在屏幕上,并确定何时重复使用不再对用户可见的项目视图。为了重复使用(或循环使用)视图,布局管理器可能会让适配器使用数据集中的不同元素替换视图的内容。以这种方式重复使用视图可避免创建不必要的视图或执行代价高昂的 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
中的View
项对象,以反映用户选择或取消选择这些项。选择库不会为所选项提供默认视觉装饰。在实现
onBindViewHolder()
时提供此设置。 我们建议您采用以下方法:- 在
onBindViewHolder()
中,对View
对象调用setActivated()
(而不是setSelected()
)并传入true
或false
,具体取决于对应的项是否处于选中状态。 - 更新视图样式以表示已激活状态。我们建议您使用颜色状态列表资源来配置样式。
- 在
- 使用
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
初始化为 SelectionTracker.Builder
时所用的同一个 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。