带有粘性标题和子标题的Recyclerview

时间:2018-12-22 18:50:54

标签: android android-recyclerview recycler-adapter

如何创建带有粘性标头和副标头(recyclerview structure)的recyclerView适配器? 一开始,我喜欢使用FlexibleAdapter制作的example。在该示例中,只有粘性标头。

data class 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 structure匹配。

1 个答案:

答案 0 :(得分:0)

我猜您的模型具有某种有关日期的数据。如果我做事不对劲,则必须创建3个不同的ViewHolders:

  1. 适用于StickyHeader的ViewHolder
  2. 用于SubHeader的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)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。