【问题标题】:Dynamic/Sectioned RecyclerView, Room and Single Data ClassDynamic/Sectioned RecyclerView, Room 和 Single Data Class
【发布时间】:2019-12-31 20:01:07
【问题描述】:

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-room android-recyclerview data-class


    【解决方案1】:

    我选择通过将 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()) {//...}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-08
      • 1970-01-01
      • 2011-06-18
      • 1970-01-01
      • 2020-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多