Dynamic / Sectioned RecyclerView,房间和单个数据类

问题描述 投票:0回答:1

Android开发和Kotlin的新手。我希望根据数据类的属性使用不同的视图,但是我不确定如何做到,也不确定是否可以做。我知道我需要重写getItemViewType,并在onCreateViewHolder中利用它,但是我对getItemViewType的代码感到困惑。

房间数据类别

data class PersonMessages(
        @Embedded
        val Person: Person,
        @Relation(
                parentColumn = "id",
                entityColumn = "person_id"
        )
        val Messages: List<Messages>
)

RecyclerView适配器

class PeopleViewAdapter: ListAdapter<PersonMessages, PeopleViewAdapter.ViewHolder>(PeopleDiffCallback()) {
//    ...
override fun getItemViewType(position: Int): Int =
        when (getItem(position)) {
            is Messages -> R.layout.fragment_message_detail
            is Person -> R.layout.fragment_people_detail
            else -> throw IllegalStateException("Illegal item view type")
        }
}

对于getItemViewType,Android Studio正确地抱怨Messages和Person是与PersonMessages不兼容的类型,但是我不知道需要更改什么以及在何处使它起作用。

感谢所有线索。

kotlin android-recyclerview android-room recycler-adapter data-class
1个回答
0
投票

我选择通过将ViewModel中的数据转换为嵌入类的列表来解决此问题。尽管我仍然不确定这是否是最好的方向,并且希望在此处提供一些评论,但相关更改如下。

class MainViewModel(private val repository: DataRepository) : ViewModel() {
    //...

    init {
        _people = Transformations.map(repository.livePeopleMessages()) { peopleWithMessages ->
            peopleWithMessages.flatMap {
                mutableListOf<Any>(it.Person).also { personWithMessages ->
                    personWithMessages.addAll(it.Messages)
                }
            }
        }
    }
//...
}

class PeopleViewAdapter: ListAdapter<Any, RecyclerView.ViewHolder>(PeopleDiffCallback()) {//...}
© www.soinside.com 2019 - 2024. All rights reserved.