Перерисовка 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 шт):
LiveData ориентируется на работу с immutable объектами. Т.е. если ваш объект поменялся, то вы должны предоставить (создать) полностью новый объект, в вашем случае просто еще раз вызвать setData(...), возможно предварительно проверив были ли реальные изменения.
Если говорить о RecyclerView, то там та же история.
Используя DiffUtil вы получите измененный объект, сравните его со старым, сформируете payload с изменениями, он придет в public void onBindViewHolder(@NonNull VH holder, int position, @NonNull List<Object> payloads) в адаптер, и вы сможете применить необходимые изменения, притом только те, которые реально поменялись. И notifyDataSetChanged использовать не стоит, даже если очень хочется.