FastAdapter 组合 Headers 和项目
FastAdapter Combine Headers and items
我使用 mikepenz 的库 fastadapter https://github.com/mikepenz/FastAdapter
需要结合不同的观点
Header 1
Item A
Item B
Item C
Hader 2
Item D
Item E
....
Class 项目
open class SimpleItemVB : AbstractBindingItem<DrawSimpleItemListBinding>() {
var name: String? = null
override val type: Int
get() = R.id.fastadapter_icon_item_id
override fun bindView(binding: DrawSimpleItemListBinding, payloads: List<Any>) {
binding.tvTitle.text = name
}
override fun createBinding(
inflater: LayoutInflater,
parent: ViewGroup?
): DrawSimpleItemListBinding {
return DrawSimpleItemListBinding.inflate(inflater, parent, false)
}
}
Class 用于显示 Headers
open class HeaderVB(
val title: String? = null
) : AbstractBindingItem<DrawHeaderItemListBinding>() {
override val type: Int
get() = R.id.fastadapter_header_item_id
override fun bindView(binding: DrawHeaderItemListBinding, payloads: List<Any>) {
binding.tvTitle.text = title
}
override fun createBinding(
inflater: LayoutInflater,
parent: ViewGroup?
): DrawHeaderItemListBinding {
return DrawHeaderItemListBinding.inflate(inflater, parent, false)
}
}
用于生成物品
private fun fetchItems(): ArrayList<SimpleItemVB> {
val items = ArrayList<SimpleItemVB>()
//How to add header???
for (i in 1..100) {
//How to add header every 3 items???
val simpleItem = SimpleItemVB()
simpleItem.name = "Test $i"
simpleItem.identifier = (100 + i).toLong()
items.add(simpleItem)
}
return items
}
我不知道如何 assemble 适配器,以便它可以有两种不同类型的视图。
一个简单的例子?因为存储库中的内容太复杂难以理解
FastAdapter
库围绕提供类型安全接口为您的 RecyclerView
构建适配器的概念构建。这种类型安全也深深地嵌套在它的 API 中(例如通过通用类型规范)以确保不会发生类型冲突。
通常您在一个列表中只有相同的类型,或者共享一个共同父类型的项目。如果项目足够不同,它们仍将始终共享 IItem<RecyclerView.ViewHolder
类型。
该库为这些场景公开了一个类型别名,以允许将您的适配器定义为 GenericFastAdapter
,并且与此类似,还公开了一个 GenericItemAdapter
或 GenericModelAdapter
,具体取决于您的用例。
除此之外,库还提供了 GenericFastItemAdapter
(结合了 FastAdapter
和 ItemAdapter
)
FastAdapter
的示例应用程序包含一个展示此类用法的示例:
类似的还有另一个示例展示了一个类似的用例,其中不同的模型映射到它们各自的项目:
我使用 mikepenz 的库 fastadapter https://github.com/mikepenz/FastAdapter
需要结合不同的观点
Header 1
Item A
Item B
Item C
Hader 2
Item D
Item E
....
Class 项目
open class SimpleItemVB : AbstractBindingItem<DrawSimpleItemListBinding>() {
var name: String? = null
override val type: Int
get() = R.id.fastadapter_icon_item_id
override fun bindView(binding: DrawSimpleItemListBinding, payloads: List<Any>) {
binding.tvTitle.text = name
}
override fun createBinding(
inflater: LayoutInflater,
parent: ViewGroup?
): DrawSimpleItemListBinding {
return DrawSimpleItemListBinding.inflate(inflater, parent, false)
}
}
Class 用于显示 Headers
open class HeaderVB(
val title: String? = null
) : AbstractBindingItem<DrawHeaderItemListBinding>() {
override val type: Int
get() = R.id.fastadapter_header_item_id
override fun bindView(binding: DrawHeaderItemListBinding, payloads: List<Any>) {
binding.tvTitle.text = title
}
override fun createBinding(
inflater: LayoutInflater,
parent: ViewGroup?
): DrawHeaderItemListBinding {
return DrawHeaderItemListBinding.inflate(inflater, parent, false)
}
}
用于生成物品
private fun fetchItems(): ArrayList<SimpleItemVB> {
val items = ArrayList<SimpleItemVB>()
//How to add header???
for (i in 1..100) {
//How to add header every 3 items???
val simpleItem = SimpleItemVB()
simpleItem.name = "Test $i"
simpleItem.identifier = (100 + i).toLong()
items.add(simpleItem)
}
return items
}
我不知道如何 assemble 适配器,以便它可以有两种不同类型的视图。
一个简单的例子?因为存储库中的内容太复杂难以理解
FastAdapter
库围绕提供类型安全接口为您的 RecyclerView
构建适配器的概念构建。这种类型安全也深深地嵌套在它的 API 中(例如通过通用类型规范)以确保不会发生类型冲突。
通常您在一个列表中只有相同的类型,或者共享一个共同父类型的项目。如果项目足够不同,它们仍将始终共享 IItem<RecyclerView.ViewHolder
类型。
该库为这些场景公开了一个类型别名,以允许将您的适配器定义为 GenericFastAdapter
,并且与此类似,还公开了一个 GenericItemAdapter
或 GenericModelAdapter
,具体取决于您的用例。
除此之外,库还提供了 GenericFastItemAdapter
(结合了 FastAdapter
和 ItemAdapter
)
FastAdapter
的示例应用程序包含一个展示此类用法的示例:
类似的还有另一个示例展示了一个类似的用例,其中不同的模型映射到它们各自的项目: