自定义动态列表 属于 Android Jetpack。
您可以自定义 RecyclerView
对象以满足您的特定需求。在使用 RecyclerView 创建动态列表 中描述的标准类提供了大多数开发者所需的所有功能。在许多情况下,您只需设计每个视图持有者的视图,然后编写代码以使用适当的数据更新这些视图。但是,如果您的应用有特定要求,您可以通过多种方式修改标准行为。本文档介绍了一些可能的自定义项。
修改布局
RecyclerView
使用布局管理器来定位屏幕上的单个项目,并确定何时重用不再对用户可见的项目视图。为了重用(或回收)视图,布局管理器可能会要求适配器用数据集中的不同元素替换视图的内容。以这种方式回收视图可以通过避免创建不必要的视图或执行耗费资源的 findViewById()
查找来提高性能。Android 支持库包含三种标准布局管理器,每种都提供了许多自定义选项:
LinearLayoutManager
:将项目排列成一维列表。将RecyclerView
与LinearLayoutManager
结合使用,可提供类似ListView
布局的功能。GridLayoutManager
:将项目排列成二维网格,就像棋盘上的方格一样。将RecyclerView
与GridLayoutManager
结合使用,可提供类似GridView
布局的功能。StaggeredGridLayoutManager
:将项目排列成二维网格,每列相对于前一列略微偏移,就像美国国旗上的星星一样。
如果这些布局管理器不符合您的需求,您可以通过扩展 RecyclerView.LayoutManager
抽象类来创建自己的布局管理器。
添加项目动画
当项目发生更改时,RecyclerView
使用*动画器*来更改其外观。此动画器是扩展 RecyclerView.ItemAnimator
抽象类的对象。默认情况下,RecyclerView
使用 DefaultItemAnimator
来提供动画。如果您想提供自定义动画,可以通过扩展 RecyclerView.ItemAnimator
来定义自己的动画器对象。
启用列表项选择功能
The recyclerview-selection
库允许用户使用触摸或鼠标输入选择 RecyclerView
列表中的项目。这可让您控制所选项目的视觉呈现。您还可以控制控制选择行为的策略,例如哪些项目符合选择条件以及可以选择多少项目。
要向 RecyclerView
实例添加选择支持,请按以下步骤操作:
- 确定要使用的选择键类型,然后构建一个
ItemKeyProvider
。您可以使用以下三种键类型来标识所选项目:
Parcelable
及其子类,例如Uri
String
Long
有关选择键类型的详细信息,请参阅
SelectionTracker.Builder
。 - 实现
ItemDetailsLookup
。 - 更新
RecyclerView
中的项目View
对象,以反映用户是选择还是取消选择它们。选择库没有为选定项目提供默认的视觉装饰。在实现
onBindViewHolder()
时提供此功能。我们推荐以下方法:- 在
onBindViewHolder()
中,对View
对象调用setActivated()
(**而非**setSelected()
),根据项目是否被选中,传入true
或false
。 - 更新 View 的样式以表示激活状态。我们建议使用颜色状态列表资源来配置样式。
- 在
- 使用
ActionMode
为用户提供对所选内容执行操作的工具。 - 执行任何已解析的次要操作。
- 使用
SelectionTracker.Builder
组装所有内容。 - 将选择功能包含在activity 生命周期事件中。
ItemDetailsLookup
允许选择库根据 MotionEvent
访问关于 RecyclerView
项目的信息。它实际上是 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
实例,您的应用必须向 SelectionTracker.Builder
提供用于初始化 RecyclerView
的相同 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。