Android使用DataBinding实现双向绑定(一)

  前面一段时间学习了一下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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值