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不兼容的类型,但是我不知道需要更改什么以及在何处使它起作用。
感谢所有线索。
我选择通过将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()) {//...}