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