如何从 recyclerView 适配器访问密封 class 的内部数据 classes

How to access inner data classes of sealed class from a recyclerView adapter

我在为正在构建的聊天界面设置 ViewModel 数据时遇到问题,我有大量不同类型的数据要在聊天布局 (RecyclerView) 中显示。这些包括: 文本、按钮、卡片视图轮播...

我已经设置了一个密封的 class,我希望它能够包含显示此数据所需的所有数据 classes,它看起来像这样 atm:

sealed class ChatMessage {
abstract var msgTime: Long?

sealed class Text : ChatMessage() {

    abstract val originator: String
    abstract var content: String

    data class Mine(
            override val originator: String,
            override var msgTime: Long?,
            override var content: String
    ) : Text()

    data class Agent(
            override val originator: String,
            override var msgTime: Long?,
            override var content: String

    ) : Text()

}

sealed class Button : ChatMessage(){

    abstract val title: String
    abstract val actionText: String

    data class General (
            override var title: String,
            override var actionText: String,
            override var msgTime: Long?
            ) : Button()
}
}

在我的适配器中,我将它添加到 arrayList 中以供显示:

    var itemsOld: ArrayList<ChatMessage> = ArrayList()

添加新项目如下:

fun addNewMessage(model: ChatMessage.Text.Mine){

    itemsOld.add(model)

    itemsOld.sortBy { it.msgTime }

   // mRecyclerView!!.smoothScrollToPosition(itemCount - 1)

    MyApplication.appContext!!.runOnUiThread {
        // Stuff that updates the UI
        notifyDataSetChanged()
    }
}

但是我无法访问

itemsOld[0].content

itemsOld[0].originator

itemsOld[0].msgTime

我如何构造数据 classes 以便我有一个父级 class 可以由 ArrayList 实现并且可以保存我可能需要显示的所有数据 classes同时在 RecyclerView 中?

None 这些字段在 ChatMessage 模型中可用。您需要将类型转换为特定数据 class 或使用 when() 表达式来为您进行转换。希望这对您有所帮助,干杯!