Обновить тип объекта LiveData с привязкой данных - PullRequest
0 голосов
/ 24 июня 2019

Я хочу обновить представления с помощью привязки данных с liveata. Давайте посмотрим на сценарий.

Класс данных

data class Movie(var name: String = "", var createdAt: String = "")

ViewModel

class MyViewModel: ViewModel(){
   var pageTitle: MutableLiveData<String>()
   var movie: MutableLiveData<Movie>()

   fun changeTitleAndMovieName()
       pageTitle.value = "Title Changed"
       movie.value.name = "Movie Name Changed"
   } 
}

XML

<layout>
    ...
    <TextView
        ...
        android:text="@{`Title: `+viewmodel.pageTitle `Name: `+viewmodel.movie.name}"/>

    <Button
        ...
        android:onClick="@{() -> viewmodel.changeTitleAndMovieName()}"/>

</layout>

Что я хочу сделать?

  • Когда нажата кнопка, название и название фильма должны измениться и отобразиться в виде.

Что происходит сейчас?

  • Из-за типа строки LiveData изменяется только заголовок страницы.
  • Название фильма НЕ отображается на виде из-за типа LiveData типа фильма, и я изменяю свойство свойства LiveData типа фильма.

Есть ли способ обновить тип фильма LiveData для представления при изменении какого-либо свойства фильма.

Я не хочу переназначать объект в liveata, например. viewmodel.movie.value = Movie(...)

1 Ответ

0 голосов
/ 25 июня 2019

У меня есть ответ на мой вопрос.Подсказка от Здесь

Ответ ссылки на ссылку является слишком длинным изменением todo.У меня есть очень простое решение.

Вот что я сделал:

Просто унаследуйте свой класс данных с BaseObservable и просто вызовите метод notifyChange() после изменения свойства вашего объекта из любого места.

т.е. Класс данных

  data class Movie(var name: String = "", var createdAt: String = "") : BaseObservable()

ViewModel

class MyViewModel: ViewModel(){
   var pageTitle: MutableLiveData<String>()
   var movie: MutableLiveData<Movie>()

   fun changeTitleAndMovieName()
       pageTitle.value = "Title Changed"
       movie.value.name = "Movie Name Changed"

       //here is the megic
       movie.value.notifyChange()
   } 
}
...