框架组件(二)Data Binding 3-结合Observer

2018-11-23  本文已影响0人  HelloBird_

该系列文章是对Android推出的架构组件相关文章,按作者自己理解来翻译的,同时标记有作者自己一些简单笔记。如果读者发现文中有翻译不准确的地方,或者理解错误的地方,请不吝指教。

源自Google官方
Data Binding Library
一文的翻译与归纳

其他相关链接:
Android Jetpack Components

[TOC]

可观测性是指一个对象能够在数据改变时通知其它对象。Data Binding 库允许你使用可观测的对象、字段或集合。

Data Binding库可以使用任何普通的对象,但是改变这些对象时不会自动触发UI更新。Data Binding 可以为你的数据对象提供数据改变时通知其他对象的能力,这里有三种不同的可观测类类型:对象、字段和集合。

当UI绑定了可观测数据对象并且数据对象的一个属性发生改变时,UI会自动刷新。

Observable fields(可观测字段)

要实现 Observable 接口会有一些工作量,如果你的类只有几个属性,那么这些工作是不值得的。基于这点,你可以使用通用的 Observable 类和以下特定的类让字段可观测。

可观测字段是包含单个字段的可观测对象。原始版本在访问操作时避免装箱和拆箱操作。要使用此机制,需要在Java代码中创建公用的final属性,或在Kotlin中创建只读属性。如下代码所示:

private static class User {
    public final ObservableField<String> firstName = new ObservableField<>();
    public final ObservableField<String> lastName = new ObservableField<>();
    public final ObservableInt age = new ObservableInt();
}

使用 set()get() 方法访问字段的值,如下:

user.firstName.set("Google");
int age = user.age.get();

注意:Android Studio 3.1 或以上版本可以使用 LiveData 对象来替代可观测对象,这种做法更有益于你的应用。

Observable collections(可观测集合)

一些应用使用动态结构来保存数据,可观测集合可以使用 key 来访问这些结构。当 key 是引用类型时,比如 StringObservableArrayMap 类是很好的选择,如下所示:

ObservableArrayMap<String, Object> user = new ObservableArrayMap<>();
user.put("firstName", "Google");
user.put("lastName", "Inc.");
user.put("age", 17);

在布局中,可以通过 key 获取 map 中的值,如下:

<data>
    <import type="android.databinding.ObservableMap"/>
    <variable name="user" type="ObservableMap<String, Object>"/>
</data>
…
<TextView
    android:text="@{user.lastName}"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>
<TextView
    android:text="@{String.valueOf(1 + (Integer)user.age)}"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

当 key 是 int 类型时,可以选择 ObservableArrayList,如下:

ObservableArrayList<Object> user = new ObservableArrayList<>();
user.add("Google");
user.add("Inc.");
user.add(17);

再布局中可以通过下表来访问列表中的数据,如下:

<data>
    <import type="android.databinding.ObservableList"/>
    <import type="com.example.my.app.Fields"/>
    <variable name="user" type="ObservableList<Object>"/>
</data>
…
<TextView
    android:text='@{user[Fields.LAST_NAME]}'
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>
<TextView
    android:text='@{String.valueOf(1 + (Integer)user[Fields.AGE])}'
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

Observable objects(可观测对象)

一个实现了 Observable 接口的类,允许注册监听可观测对象的数据改变。

Observable 接口有添加和移除监听的机制,但是你必须决定什么时候发送通知。为了让开发更容易,DataBinding 库提供了 BaseObservable 类,它已经实现了监听器注册机制。继承自 BaseObservable 的数据类主要负责属性改变时进行通知。为 getter 方法添加 @Bindable 并在 setter 中调用 ntifyPropertyChanged() 通知属性改变,如下所示:

private static class User extends BaseObservable {
    private String firstName;
    private String lastName;

    @Bindable
    public String getFirstName() {
        return this.firstName;
    }

    @Bindable
    public String getLastName() {
        return this.lastName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
        notifyPropertyChanged(BR.firstName);
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
        notifyPropertyChanged(BR.lastName);
    }
}

DataBinding 会为 module 中使用了数据绑定的 ID 和资源生成 BR 类。编译时在 BR 类中生成 Bindable 注解的条目。如果无法修改数据类的基类,可以使用 PropertyChangeRegistry 对象来实现 Observable 接口,以实现注册和通知监听器。

上一篇下一篇

猜你喜欢

热点阅读