使用BaseObservable进行双向绑定
自定义一个继承于BaseObservable的ViewModel(并不是Jetpack的ViewModel类),可用于双向绑定,具体做法如下:
想要绑定一个数据,就需要在其get方法中用@Bindable注解:
private User user;
@Bindable
public String getUserName(){
return user.userName;
}
在对其进行修改的时候,需要调用notifyPropertyChanged以声明其已经改变:
public void setUserName(String name){
if (!TextUtils.isEmpty(name)&&!name.equals(user.userName)){
user.userName=name;
Log.d("shopkeeperTag", "setUserName: "+name);
// BR是用Bindable注解标记的量,且必须是getXXX
notifyPropertyChanged(BR.userName);
}
}
在xml中进行数据的双向绑定时,需要使用@={}语法:
<EditText
android:text="@={viewModel.userName}" />
使用ObservableField进行双向绑定
ObservableField的使用类似于LiveData:
private ObservableField<User> userObservableField;
此时,只需要定义需要绑定的变量的setter和getter方法之后,并在xml中使用@={}语法,就能完成双向绑定:
public String getUserName(){
return userObservableField.get().userName;
}
public void setUserName(String userName){
Log.d("shopkeeperTag", "setUserName: "+userName);
userObservableField.get().setUserName(userName);
}
此方法的一个弊端是,必须使用setter方法来对数据进行修改,否则更改不会应用到视图上。