自定义动态列表 Android Jetpack 的一部分。
您可以自定义 RecyclerView
对象以满足您的特定需求。在 使用 RecyclerView 创建动态列表 中描述的标准类提供了大多数开发人员需要的所有功能。在许多情况下,您只需要设计每个视图持有者的视图,并编写代码以使用适当的数据更新这些视图。但是,如果您的应用有特定要求,您可以通过多种方式修改标准行为。本文档描述了一些可能的自定义。
修改布局
RecyclerView
使用布局管理器将屏幕上的各个项目定位,并确定何时重用对用户不再可见的项目视图。要重用(或 *循环使用*)视图,布局管理器可能会要求适配器将视图的内容替换为数据集中的不同元素。以这种方式循环使用视图通过避免创建不必要的视图或执行昂贵的 findViewById()
查找来提高性能。Android 支持库包含三个标准布局管理器,每个管理器都提供了许多自定义选项
LinearLayoutManager
:将项目排列在一维列表中。使用带有LinearLayoutManager
的RecyclerView
提供与ListView
布局类似的功能。GridLayoutManager
:将项目排列成二维网格,就像棋盘上的方格一样。使用带有GridLayoutManager
的RecyclerView
提供与GridView
布局类似的功能。StaggeredGridLayoutManager
:将项目排列成二维网格,每一列都稍微偏移前一列,就像美国国旗上的星星一样。
如果这些布局管理器不符合您的需求,您可以通过扩展 RecyclerView.LayoutManager
抽象类来创建自己的布局管理器。
添加项目动画
每当项目发生更改时,RecyclerView
使用 *动画器* 来更改其外观。此动画器是一个扩展抽象 RecyclerView.ItemAnimator
类的对象。默认情况下,RecyclerView
使用 DefaultItemAnimator
来提供动画。如果您想提供自定义动画,可以通过扩展 RecyclerView.ItemAnimator
来定义自己的动画器对象。
启用列表项选择
recyclerview-selection
库允许用户使用触摸或鼠标输入在 RecyclerView
列表中选择项目。这使您可以保留对所选项目的视觉呈现的控制权。您还可以保留对控制选择行为的策略的控制权,例如哪些项目有资格选择以及可以选择多少个项目。
要将选择支持添加到 RecyclerView
实例,请执行以下步骤
- 确定要使用哪个选择键类型,然后构建一个
ItemKeyProvider
。您可以使用三种键类型来标识选定的项目
Parcelable
及其子类,如Uri
字符串
长整型
有关选择键类型的详细信息,请参阅
SelectionTracker.Builder
。 - 实现
ItemDetailsLookup
。 - 更新
RecyclerView
中的项目View
对象以反映用户选择或取消选择它们。选择库不提供所选项目的默认视觉装饰。在实现
onBindViewHolder()
时提供此装饰。我们建议采用以下方法- 在
onBindViewHolder()
中,调用setActivated()
(**不是**setSelected()
)在View
对象上,使用true
或false
,具体取决于项目是否被选中。 - 更新视图的样式以表示激活状态。我们建议使用 颜色状态列表资源 来配置样式。
- 在
- 使用
ActionMode
为用户提供执行选择操作的工具。 - 执行任何解释的次要操作。
- 使用
SelectionTracker.Builder
将所有内容组装起来。 - 在 活动生命周期 事件中包含选择。
ItemDetailsLookup
允许选择库访问有关 RecyclerView
项目的信息,前提是给定一个 MotionEvent
。它实际上是 ItemDetails
实例的工厂,这些实例由 RecyclerView.ViewHolder
实例支持或从中提取。
注册一个 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
实例,您的应用必须提供与用于初始化 RecyclerView
的 RecyclerView.Adapter
相同的适配器,才能提供给 SelectionTracker.Builder
。出于这个原因,在创建 SelectionTracker
实例后,将其注入到您的 RecyclerView.Adapter
中。否则,您将无法从 onBindViewHolder()
方法检查项目的选中状态。
要跨活动生命周期事件保留选择状态,您的应用必须从活动的 onSaveInstanceState()
和 onRestoreInstanceState()
方法中分别调用选择跟踪器的 onSaveInstanceState()
和 onRestoreInstanceState()
方法。您的应用还必须向 SelectionTracker.Builder
构造函数提供一个唯一的选择 ID。此 ID 是必需的,因为活动或片段可能有多个不同的可选择列表,所有这些列表都需要在其保存状态中持久化。
其他资源
请参阅以下参考资料以获取更多信息。
- Sunflower 演示应用,它使用
RecyclerView
。 - 使用 RecyclerView 显示可滚动列表 代码实验室。
- Android Kotlin 基础知识:RecyclerView 基础知识 代码实验室。