android具有多种视图类型的回收器视图

nukf8bse  于 2021-07-07  发布在  Java
关注(0)|答案(1)|浏览(268)

我有两种视图类型(项目和页脚)的recyclerview。我需要在屏幕底部显示我的页脚,即使没有项目或项目大小是1。有可能实施吗?现在我的页脚显示后,最后一项,但我需要显示页脚总是在底部。

wecizke3

wecizke31#

您需要一个允许您这样做的数据结构,然后需要视图持有者来支持它,一旦完成了对适配器上的条件流的处理,就应该可以开始了。
通常,在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

}

这是一个很好的“把戏”有密封的后代在里面,这样密封的父母使一个域名空间名称,然后你这样称呼他们 AdapterRow.RegularItem(...) . 如果不喜欢,sealed类有一个约束,子类必须在同一个文件上。
然后需要一个视图固定器来支持每种类型(视图固定器和布局中的视图,如果需要)。在本例中,我们将使用一个抽象类来利用多态性和抽象方法

//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)

相关问题