首页 > 解决方案 > 带有粘性标题和子标题的 Recyclerview

问题描述

如何创建带有粘性标题和子标题(recyclerview 结构)的 recyclerView 适配器?一开始我确实喜欢这个例子,使用 FlexibleAdapter 制作。在示例中,只有粘性标题。

数据类 SectionItem(private val title: String, private val headerItem: HeaderItem) :
        AbstractFlexibleItem(),
        ISectionable {

override fun getLayoutRes(): Int = R.layout.section override fun getHeader(): HeaderItem = headerItem override fun setHeader(headerItem: HeaderItem) { } override fun createViewHolder(view: View?, adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>?): ViewHolder = ViewHolder(view, adapter) override fun bindViewHolder(adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>?, holder: ViewHolder?, position: Int, payloads: MutableList<Any>?) { holder?.let { it.title.text = title } } class ViewHolder(view: View?, adapter: FlexibleAdapter<*>?) : FlexibleViewHolder(view, adapter) { var title: TextView = view?.findViewById(R.id.title)!! }}

在 SectionItem 中,我无法使用 subHeader 实现 ISectionable。在查看了 FlexibleAdapter 库的文档后,我认为不可能创建带有子标题的列表结构。请告诉有什么其他方法可以制作一个与recyclerview 结构匹配的子标题。

标签: androidandroid-recyclerview

解决方案


我猜你的模型有一些关于日期的数据。如果我猜对了,你必须创建 3 个不同的 ViewHolders:

  1. StickyHeader 的 ViewHolder
  2. 子标题的 ViewHolder
  3. 您的 json 项目的 ViewHolder

现在创建将接受List<YourJsonObject>列表的方法。在该方法中,您将不得不遍历该列表并检查您的模型的日期。在那里,您应该设置一些逻辑来检查以前的YourJsonObject日期。

val newList = mutableListOf<SomeKindOfInterface>()

fun setData(list: List<YourJsonObject>) {
    newList.clear()

    var previousMonth = 0
    var previousDay = 0
    for (yourJsonObject in list) {

        if (yourJsonObject.month != previousMonth) {
            previousMonth = yourJsonObject.month
            newList.add(MonthObject(yourJsonObject.month))
        }

        if (yourJsonObject.day != previousDay) {
            previousDay = yourJsonObject.day
            newList.add(DayObject(yourJsonObject.day))
        }

        newList.add(yourJsonObject)
    }
}



class YourJsonObject(
    val month: Int,
    val day: Int
) : SomeKindOfInterface

class MonthObject(val month: Int) : SomeKindOfInterface

class DayObject(val day: Int) : SomeKindOfInterface

interface SomeKindOfInterface

之后,您应该覆盖getItemViewType(position: Int)and onCreateViewHolder(parent: ViewGroup, viewType: Int)。根据您的数据,根据项目位置newList返回不同的 ViewType。

override fun getItemViewType(position: Int): Int {
    return when (newList.get(position)) {
        is YourJsonObject -> 0
        is MonthObject -> 1
        is DayObject -> 2
    }
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
    return when (viewType) {
        0 -> createYourJsonObjectViewHolder
        1 -> createMonthObjectViewHolder
        2 -> createDayObjectViewHolder
    }
}

当然,我在这里给您的代码只是示例,但是有了这些信息,您应该可以将其应用于您的问题。

MonthObject是你的 StickyHeader 并且DayObject是你的 SubHeader。


推荐阅读