Как получить доступ к внутренним классам данных закрытого класса из адаптера recyclerView - PullRequest
0 голосов
/ 17 июня 2019

У меня проблемы с настройкой данных ViewModel для создаваемого мной интерфейса чата. У меня есть широкий спектр различных типов данных, которые я хочу показать в макете чата (RecyclerView). Они включают: Text, Buttons, Card view carousel ...

Я установил класс Sealed, который, я надеюсь, сможет содержать все классы данных, необходимые для отображения этих данных, которые выглядят так:

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

Как я могу структурировать классы данных таким образом, чтобы у меня был один родительский класс, который может быть реализован ArrayList и может содержать все классы данных, которые могут понадобиться для одновременного отображения в RecyclerView?

1 Ответ

1 голос
/ 17 июня 2019

Ни одно из этих полей не доступно в модели ChatMessage. Вам нужно либо привести тип к определенному классу данных, либо использовать выражение when (), которое выполнит преобразование за вас. Надеюсь, это поможет, ура!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...