您需要一个允许您这样做的数据结构,然后需要视图持有者来支持它,一旦完成了对适配器上的条件流的处理,就应该可以开始了。 通常,在Kotlin我们使用 sealed class 它允许很好的类型控制
sealed class AdapterRow {
data class RegularItem(/*your values*/) : AdapterRow()
data class FooterItem(/*your values*/) : AdapterRow()
//if the footer is always the same maybe object FooterItem : AdapterRow() is more suitable
}
//you could use binding here and then the implementation define the binding type
abstract class BaseViewHolder(view: View) : RecyclerView.ViewHolder(view) {
abstract fun bind(row: AdapterRow)
}
然后孩子们:
class RegularItemViewHolder(view: View) : BaseViewHolder(view) {
override fun bind(row: AdapterRow) {
//validate the data you are receiving is correct
if (row !is AdapterRow.RegularItem) return
//do your data bindings, view findings or whatever
}
}
通过上面的内容,您可以推断出另一个视图持有者,现在是适配器方法
getItemViewType(position: Int) {
when(getItem(position)) {
is AdapterRow.RegularItem -> R.layout.REGULAR_ITEM_LAYOUT
is AdapterRow. FooterItem -> R.layout.FOOTER_ITEM_LAYOUT
}
}
onCreateViewHolder(...) {
return when (viewType) {
R.layout.REGULAR_ITEM_LAYOUT -> {
RegularItemViewHolder(...)
}
R.layout.FOOTER_ITEM_LAYOUT {
//same but for footer
}
else -> throw RuntimeException("Unsupported view Holder)
}
}
onBindViewHolder(...) {
holder.bind(getItem(position))
}
数据构造部分是最后一件事,在其他地方,您的片段、视图模型等,您必须根据需要创建数据结构。举例来说:
fun makeRows(texts: List<String>): List<AdapterRow> {
val rows = mutableListOf<AdapterRow>()
texts.forEach { text ->
//do some mapping from what ever is your source in this case strings
AdapterRow.RegularItem(...text)
}
//so it doesn't matter if the source of data is empty at the end you always add the footer
rows.add(AdapterRow.FooterItem)
}
如果您使用 ListAdapter ``` val rows = someClass.makeRows(....) yourAdapter.submitList(rows)
1条答案
按热度按时间wecizke31#
您需要一个允许您这样做的数据结构,然后需要视图持有者来支持它,一旦完成了对适配器上的条件流的处理,就应该可以开始了。
通常,在Kotlin我们使用
sealed class
它允许很好的类型控制这是一个很好的“把戏”有密封的后代在里面,这样密封的父母使一个域名空间名称,然后你这样称呼他们
AdapterRow.RegularItem(...)
. 如果不喜欢,sealed类有一个约束,子类必须在同一个文件上。然后需要一个视图固定器来支持每种类型(视图固定器和布局中的视图,如果需要)。在本例中,我们将使用一个抽象类来利用多态性和抽象方法
然后孩子们:
通过上面的内容,您可以推断出另一个视图持有者,现在是适配器方法
数据构造部分是最后一件事,在其他地方,您的片段、视图模型等,您必须根据需要创建数据结构。举例来说:
如果您使用
ListAdapter
```val rows = someClass.makeRows(....)
yourAdapter.submitList(rows)