Перерисовка View при изменении одного из свойства поля LiveData | Kotlin

Пытаюсь разобраться с LiveData.

Создал экземпляр:

var data: MutableLiveData<Book> = MutableLiveData<Book>()

Getter&Setter:

fun setData(context: Context, id: String, res: Book.Resource) {
    data.value = //получаю экземпляр объекта Book
}

fun getLiveData() = data

Во фрагменте я добавляю слушателя:

model.data.observe(viewLifecycleOwner, Observer {
        title.text = it.title
        description.text = it.description
        //и т.д.
    })

    model.setData(root.context, id, resource!!)

И тут возникает вопрос, как подписаться на внутренние компоненты Book? Вот пример:

У класса Book есть следующие свойства: id, title, image, genre и т.д; я через ссылку model.data(т.е. на прямую через переменную) изменяю, допустим, свойство title. Мне надо, чтобы и на view все тоже обновилось. У RecyclerAdapter есть notifyDataSetChanged, а есть ли такое у LiveData?

Или придется делать как-то так (костылями)?

val m = model.data.value
m?.title = "adad"
model.data.value = m

Ответы (1 шт):

Автор решения: Yura Ivanov

LiveData ориентируется на работу с immutable объектами. Т.е. если ваш объект поменялся, то вы должны предоставить (создать) полностью новый объект, в вашем случае просто еще раз вызвать setData(...), возможно предварительно проверив были ли реальные изменения.

Если говорить о RecyclerView, то там та же история.
Используя DiffUtil вы получите измененный объект, сравните его со старым, сформируете payload с изменениями, он придет в public void onBindViewHolder(@NonNull VH holder, int position, @NonNull List<Object> payloads) в адаптер, и вы сможете применить необходимые изменения, притом только те, которые реально поменялись. И notifyDataSetChanged использовать не стоит, даже если очень хочется.

→ Ссылка