前面一段时间学习了一下Android中的DataBinding,但是只是很简单地实现了一下,DataBinding中最强大的地方还没有认真地学习过,有很多地方还不理解。这次,深入学习一下DataBinding的双向绑定和MVVM模式。
1、实现简单的使用
先回顾一下简单的使用,使用的时候需要在模块的build.gradle文件中添加这一句:
dataBinding{
enabled=true
}
添加这一句之后,gladle文件sync之后就可以开始使用。
接着我们开始搭建一个基于MVVM+DataBinding简单的开发框架。
1.1、view层
首先是新建一个全局的View的接口和一个基类的BaseActivity,具体代码如下:
//全局的接口
public interface IView {
void setViewModel(BaseVM baseVM);
}
//基类的BaseActivity
public abstract class BaseActivity extends AppCompatActivity implements IView{
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
}
基类的activity在具体的项目中会封装一些常用的方法,比如实现的activity的安全退出等,这里不是真实的项目,所以就没有封装那些方法。
1.2、viewmodel层
上面搭建完成view层,接着是viewmodel层。同样,需要建一个全局的基类BaseVM,BaseVM的具体代码如下:
public class BaseVM {
public String getString(int resID) {
return TestApplication.getContext().getString(resID);
}
}
这里的这个方法是用于获取资源文件里面的字符串,直接写在这里,我们需要在VM中使用的时候可以直接使用,方便。
1.3、model层
model层的话很多都是数据bean,这里我们新建一个简单的bean,这个bean只是简单的封装一些显式信息,为了可以实现自动更新,我们需要做一些处理,具体的代码如下:
public class UserBean extends BaseObservable {
private String userCard;
private String userName;
private String userAddres;
private String userEmail;
public UserBean() {
}
public UserBean(String userCard, String userName, String userAddres, String userEmail) {
this.userCard = userCard;
this.userName = userName;
this.userAddres = userAddres;
this.userEmail = userEmail;
}
@Bindable
public String getUserCard() {
return userCard;
}
public void setUserCard(String userCard) {
this.userCard = userCard;
notifyPropertyChanged(cn.amos.BR.userCard);
}
@Bindable
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
notifyPropertyChanged(cn.amos.BR.userName);
}
@Bindable
public String getUserAddres() {
return userAddres;
}
public void setUserAddres(String userAddres) {
this.userAddres = userAddres;
notifyPropertyChanged(cn.amos.BR.userAddres);
}
@Bindable
public String getUserEmail() {
return userEmail;
}
public void setUserEmail(String userEmail) {
this.userEmail = userEmail;
notifyPropertyChanged(cn.amos.BR.userEmail);
}
@Override
public String toString() {
return "UserBean{" +
"userCard=" + userCard +
", userName='" + userName + '\'' +
", userAddres='" + userAddres + '\'' +
", userEmail='" + userEmail + '\'' +
'}';
}
}
这里继承了BaseObservable这个类,以及后面在Get方法上面添加@Bindable注解为了实现自动更新,也是需要在set方法中添加notifyPropertyChanged(cn.amos.BR.userEmail);这一句代码,这里是提醒更新数据。需要注意的是BR这个类,比较容易弄乱。
还做一个封装就是DataBindingUtils,看一下具体的代码:
public class DataBindingUtils {
private static ArrayMap<BaseActivity, ArrayMap<Observable, Observable.OnPropertyChangedCallback>> commonMap = new ArrayMap<>();
public static void addCallBack(BaseActivity baseActivity,
Observable observable, Observable.OnPropertyChangedCallback callback) {
ArrayMap<Observable, Observable.OnPropertyChangedCallback> callbackArrayMap = commonMap.get(baseActivity);
if (callbackArrayMap == null) {
callbackArrayMap = new ArrayMap<>();
commonMap.put(baseActivity, callbackArrayMap);
}
observable.addOnPropertyChangedCallback(callback);
callbackA