Jetpack之DataBinding

使用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方法来对数据进行修改,否则更改不会应用到视图上。

发表评论