前言
现在来说明一下DataBinding的数据绑定
单向数据绑定
这里的单向数据绑定指的是model类的数据变化,界面的数据跟着变化
BaseObservable
先对model进行改造
package com.shart.model;
import androidx.databinding.BaseObservable;
import androidx.databinding.Bindable;
import com.shark.databindingdemo2.BR;
public class User extends BaseObservable {
//如果是 public 修饰符,则可以直接在成员变量上方加上 @Bindable 注解
@Bindable
public String name;
private String age;
public User(String name, String age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//更新指定属性
public void myNotifyPropertyChanged() {
notifyPropertyChanged(com.shark.databindingdemo2.BR.name);
}
//更新所有字段
public void myNotifyChange() {
notifyChange();
}
//如果是 private 修饰符,则在成员变量的 get 方法上添加 @Bindable 注解
@Bindable
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
当给属性加上@Bindable注解的时候DataBinding会自动生成一个BR.Field (这里在使用这个BR的时候可能会报错你运行一下app让其生成就可以了)
notifyChange方法会改变所有的属性显示
notifyPropertyChanged改变其指定的属性
在适当的时候调用notifyChange或者notifyPropertyChanged方法就可以了,这里就不做演示了
还可以在model添加一个回调方法,这样属性改变的时候就能做一些处理了
user.addOnPropertyChangedCallback(new Observable.OnPropertyChangedCallback() {
@Override
public void onPropertyChanged(Observable sender, int propertyId) {
}
});
这里的propertyId参数就是生成的BR的值了
ObservableField
我们可以不用继承BaseObservable,也不用自己手动去notify
所以可以使用以下方式
将model改为以下
package com.shart.model;
import androidx.databinding.ObservableField;
public class ObservableUser {
private ObservableField<String> name;
private ObservableField<String> age;
public ObservableUser(String name, String age) {
this.name = new ObservableField<>(name);
this.age = new ObservableField<>(age);
}
public ObservableField<String> getName() {
return name;
}
public void setName(String name) {
this.name = new ObservableField<>(name);
}
public ObservableField<String> getAge() {
return age;
}
public void setAge(String age) {
this.age = new ObservableField<>(age);
}
}
修改属性的时候使用 以下方法
public void changeAll() {
user.getName().set("code" + new Random().nextInt(100));
user.getAge().set("age"+new Random().nextInt(100));
}
ObservableField还支持基本数据类型,例如 ObservableBoolean、ObservableByte、ObservableChar、ObservableShort、ObservableInt、ObservableLong、ObservableFloat、ObservableDouble 以及 ObservableParcelable ,
ObservableCollection
这个就是封装了List、Map等类。将它变为ObservableList、ObservableMap。
使用起来和List、Map无区别,只是会自动更新ui数据
双向数据绑定
双向绑定的意思即为当数据改变时同时使视图刷新,而视图改变时也可以同时改变数据
这里只要在布局文件中改一个地方就行了,@后面加上=
android:text="@={userInfo.name}"
网友评论