看下这句代码:binding.getUser().setUserName(binding.etUserName.getText().toString());我们使用dataBinding获取声明过的User对象,然后为其属性userName赋值。看到这里,我们也只是看到更改了数据,没有看到任何更新UI的代码。
不要急,我们接着看一下数据类UserModel的实现就明白了。
package com.ha.cjy.databingdemo.model;
import android.databinding.BaseObservable;
import android.databinding.Bindable;
import com.ha.cjy.databingdemo.BR;
/**
* 用户
* Created by cjy on 17/12/5.
*/
public class UserModel extends BaseObservable {
/**
* 用户名
*/
//注解 数据变动更新UI更新
@Bindable
private String userName;
/**
* 手机号码
*/
@Bindable
private String telPhone;
public UserModel() {
}
public UserModel(String userName, String telPhone) {
this.userName = userName;
this.telPhone = telPhone;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
//与@Bindable配合使用,数据有更新,通知UI跟着更新
notifyPropertyChanged(BR.userName);
}
public String getTelPhone() {
return telPhone;
}
public void setTelPhone(String telPhone) {
this.telPhone = telPhone;
notifyPropertyChanged(BR.telPhone);
}
}
由上面代码中,我们看到了注解Bindable,这个是用来标识属性是否有变动。官方介绍如下:
The Bindable annotation should be applied to any getter accessor method of an
* {@link Observable} class. Bindable will generate a field in the BR class to identify
* the field that has changed.
当然了,只是标识属性变动是不够的,这时还是没有通知UI更新的。我们需要使用notifyPropertyChanged方法,告知UI数据变化了从而更新UI。
注意,notifyPropertyChanged方法的参数需要使用BR.属性名才可以。dataBinding在BR类中为对象属性生成了唯一的标识码。