@Bindable
public String getFirstName() {
return this.firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
notifyPropertyChanged(BR.firstName);
}
@Bindable
public String getLastName() {
return this.lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
notifyPropertyChanged(BR.lastName);
}
@Bindable({"firstName", "lastName"})
public void getName() {
return this.firstName + ' ' + this.lastName;
}
以上是我从Google的示例代码中提取的代码-https://developer.android.com/reference/android/databinding/Bindable
并以类似XML的格式使用
<TextView
android:id="@+id/first_name"
.....
android:text="@{myViewModel.firstName}" />
<TextView
android:id="@+id/last_name"
.....
android:text="@{myViewModel.lastName}" />
<TextView
android:id="@+id/full_name"
.....
android:text="@{myViewModel.getName()}" />
每当我打电话给myViewModel.setFirstName("Mohammed");
时,它都会更新视图中的名字,而不是全名。甚至文档都是错误的,也不可靠。
与此问题相关的其他帖子没有太大帮助,因为它们中的大多数都处理非参数化的Bindable。
按照文档中的这一行
每当firstName或lastName发出更改通知时,名称也将被视为不合法。这并不意味着将为BR.name通知onPropertyChanged(Observable,int),只有包含name的绑定表达式才会被弄脏和刷新。
我也尝试调用notifyPropertyChanged(BR.name);
,但这对结果没有任何影响。
答案 0 :(得分:2)
只是个黑客
public class Modal {
private String firstName;
private String lastName;
private String name;
@Bindable
public String getFirstName() {
return this.firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
notifyPropertyChanged(BR.firstName);
notifyPropertyChanged(BR.name);
}
@Bindable
public String getLastName() {
return this.lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
notifyPropertyChanged(BR.lastName);
notifyPropertyChanged(BR.name);
}
@Bindable
public void getName() {
return this.firstName + ' ' + this.lastName;
}
}
答案 1 :(得分:1)
因此,在对数据绑定概念进行了彻底分析之后,我发现,当我们在notifyPropertyChanged
类上调用BaseObservable
时,它实际上是通知属性,而不是通知getter和setter。
因此,在我上面的问题中,JAVA部分没有任何更改,但是XML部分中需要进行更改。
<TextView
android:id="@+id/first_name"
.....
android:text="@{myViewModel.firstName}" />
<TextView
android:id="@+id/last_name"
.....
android:text="@{myViewModel.lastName}" />
<TextView
android:id="@+id/full_name"
.....
android:text="@{myViewModel.name}" />
由于我将getName()
声明为Bindable({"firstName", "lastName"})
,因此数据绑定将生成属性name
,因此我必须在XML中侦听myViewModel.name
而不是myViewModel.getName()
。而且我们甚至不必通知name
进行更改,由于参数化的Bindable,仅通知firstName
或lastName
会通知属性name
。
但是请确保