回顾

data-binding-1中,只是实现了 xml 文件对 JavaBean 的读取,并没有体现MVVM设计模式的所有内容。

Data-binding 最有意思的地方是,当改变 JavaBean 数据时,修改能够实时地体现在 UI 上。而我们这次要做的就是这件事。

修改实体类

我们之前的实体类是这样的:

public class User {
    private String name;
    private String age;

    public User(String age, String name) {
        this.age = age;
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public String getAge() {
        return age;
    }
}

为控件设置点击事件,在点击事件中修改 User 实例的成员变量,会发现虽然实例中的数据确实变了,但是在 UI 上并没有体现出来。

有一种做法是让 User 继承BaseObservable,但是该方法麻烦而且代码量大,不作介绍。

另一种较好的做法是,使每个成员变量都是一个ObservableField类,此类继承了BaseObservable并且实现了Serializable接口。

此时,User 类变为:

public class User extends BaseObservable {
    public ObservableField<String> name = new ObservableField<>();
    public ObservableField<Integer> color = new ObservableField<>();
    public ObservableField<String> age = new ObservableField<>();

    public User(String age, int color, String name) {
        this.name.set(name);
        this.age.set(age);
        this.color.set(color);
    }
}

可以看见,代码极其简洁,不用设置setter/getter。需要注意的是,需要为每个变量实例化。成员变量以下面的方式赋值和获取:

user.name.set("xxxx");
String name = user.name.get();

在点击(或其他)事件中改变数据

如在按钮的点击事件中改变 user 的 name 值,TextView即随之更新。

user.name.set(String.valueOf(Math.random() * 100));

总结

通过 demo 可以知道,使用 data-binding 直接省去了:

  • 为控件设置 id

  • 使用 findViewById 实例化 view

  • 使用 setText 等语句更新 UI