好文推荐:使用-ConcatAdapter-顺序连接其他-Adapter,安卓移动开发实验报告
△ 一个带有底部的 RecyclerView,底部显示了加载状态: 加载进度或错误信息ConcatAdapter 简介ConcatAdapter 让我们可以顺序显示多个 Adapter 中的内容。例如,假设我们有下面三个 Adapter:val firstAdapter: FirstAdapter = …val secondAdapter: SecondAdapter = …val th
△ 一个带有底部的 RecyclerView,底部显示了加载状态: 加载进度或错误信息
ConcatAdapter 简介
ConcatAdapter 让我们可以顺序显示多个 Adapter 中的内容。例如,假设我们有下面三个 Adapter:
val firstAdapter: FirstAdapter = …
val secondAdapter: SecondAdapter = …
val thirdAdapter: ThirdAdapter = …
val concatAdapter= ConcatAdapter(firstAdapter, secondAdapter,
thirdAdapter)
recyclerView.adapter = concatAdapter
RecyclerView
将会按 Adapter 顺序显示所有的项目。
使用不同的适配器可以使您更好地区分列表的每个部分。例如,如果要显示一个头部,可以将其封装在它自己的 Adapter 中,而无需把头部的逻辑与处理列表显示的 Adapter 混杂在一起。
△ RecyclerView 和 Adapter 数据
在头部和底部显示加载状态
我们可以在头部或底部显示一个进度条或错误信息。列表成功加载数据后,头部或底部便不应该再显示任何信息。这样一来,它们就可以用 Adapter 实现有 0 个或 1 个项目的列表:
val concatAdapter = ConcatAdapter(headerAdapter, listAdapter,
footerAdapter)
recyclerView.adapter = concatAdapter
复制代码
如果头部和底部用的是同一布局、ViewHolder 和 UI 逻辑 (例如: 进度条要何时显示、怎么显示),您可以只实现一个 Adapter,然后创建两个实例: 一个作为头部、一个作为底部。
要获得完整的实现,请查看这里 拉取请求,它添加了:
- 从 ViewModel 中暴露出来的 LoadState
- 显示加载状态的头部和底部的布局
- 头部和底部的 ViewHolder 对象
- 一个 ListAdapter,它基于 LoadState 显示 1 或 0 个项目,每次 LoadState 有变动的时候,我们会通知相应条目进行改动、插入或移除 (您可以在 拉取请求 中查看相应的代码)。
🔎 更多关于 ConcatAdapter 的信息
ViewHolder
默认情况下,每个 Adapter 维护它们自己的 ViewHolder 池,在 Adapter 之间不会进行复用。但如果多个 Adapter 使用的是同一种 ViewHolder,我们可能会想要在 Adapter 间复用 ViewHolder 的实例。我们可以在构造 ConcatAdapter 时使用一个 ConcatAdapter.Config 对象来实现这样的效果。只要设置 isolateViewTypes = false,就可以让所有合并进来的 Adapter 使用同一个视图池。在显示加载状态的头部和底部的例子中,两种 ViewHolder 事实上使用的是相同的内容,所以我们可以复用它们。
⚠️ 如果要支持不同的 ViewHolder 类型,您应该实现 Adapter.getItemViewType) 方法。当您复用 ViewHolder 时,确保同一视图类型没有对应不同的 ViewHodler!防止出现这个问题的最佳实践之一,便是将布局 ID 作为视图类型返回。
class HeaderAdapter() : RecyclerView.Adapter
() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return LoadingStateViewHolder(parent)
}
override fun getItemViewType(position: Int): Int {
-
return 0
-
return R.layout.list_loading
}
}
class FooterAdapter() : RecyclerView.Adapter() {
() : RecyclerView.Adapter() {
更多推荐
所有评论(0)