考虑到这种情况。
模型
data class User(var id: int, var name: String)
查看型号
val Users: LiveData<List<User>>
val SelectedUser: LiveData<User>
fun changeSelectedUserName(){SelectedUser.Name = "foo"}
界面
<android:TextView Text="@{viewmodel.SelectedUser.name}"/>
<android:Button Text="Change!" onClik="@{() -> viewmodel.changeSelectedUserName()}"/>
当用户点击 "Change!"按钮时,文本视图不会改变,因为 "name "字段不是LiveData。
疑问
你的问题是你修改了 User
对象属性,而不是直接更新LiveData。
要做到这一点,你必须做以下工作之一。
Make User
延伸 BaseObservable
,并调用 notifyPropertyChanged(BR.name)
当 name
属性变化,并删除 LiveData<User>
.
使 User
延伸 BaseObservable
,并把 @Bindable
注解,并删除属性获取器上的 LiveData<User>
.
使 User
属性 val
,并且要进行修改,请创建一个新的 User
实例,并将其设置为具有更改属性的 MutableLiveData<User>
.
沟渠 SelectedUser
全部,代之以两个 ObservableField
的,一个为 selectedId: ObservableInt
,和一个用于 selectedName: ObservableField<String>
. 现在你可以修改原地的值,也可以从databinding创建针对它的绑定。
移除数据绑定并使用viewbinding来代替,现在你不必担心通知数据绑定框架的属性变化。😏
数据类是否也应该将其字段重新暴露为LiveData?
不应该