使用数据绑定更新对象类型LiveData

时间:2019-06-24 17:19:27

标签: android mvvm data-binding android-livedata

我想通过与livedata的数据绑定来更新视图。让我们来看看这种情况。

数据类

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的属性。

在更改Movie的任何属性时,是否有任何方法可以将Movie类型LiveData更新为视图。

我不想将对象重新分配给实时数据,例如viewmodel.movie.value = Movie(...)

1 个答案:

答案 0 :(得分:0)

我已经回答了我的问题。 Here

的提示

参考链接的答案是待办事项变长。我有一个非常简单的解决方案。

这是我所做的:

只需使用 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()
   } 
}