DataBinding使用指南(二):使用可观察的数据对象

DataBinding使用指南(一):布局和binding表达式

DataBinding使用指南(二):使用可观察的数据对象

DataBinding使用指南(三):生成binding类

DataBinding使用指南(四):BindingAdapter

DataBinding使用指南(五):绑定布局视图到架构组件



开篇之前我们首先要理解一个概念, 可观察性 是指什么意思? 可观察性是指 当一个对象的数据或状态发生改变时具有通知其他观察者的能力

DataBinding库允许我们创建可观察的对象、字段或集合,当我们的数据发生改变时需要通知其他对象就可以使用DataBinding,它主要有三种不同类型的可观察类型,分别为:对象、字段或集合。当这些可观察的数据对象绑定到 UI ,并且数据对象的属性发生改变时,UI 也将自动更新。是不是感觉跟观察者模式的效果一样。

可观察的字段


有时候一些工作会涉及到创建实现了 Observable 接口的类,但是如果这个类只有几个属性,我们这样做是又不值得。在这种情况下,我们可以使用泛型类Observable,以下是基本类型的可观察字段:

  • ObservableBoolean
  • ObservableByte
  • ObservableChar
  • ObservableShort
  • ObservableInt
  • ObservableLong
  • ObservableFloat
  • ObservableDouble
  • ObservableParcelable

Observable 字段是具有单个字段的独立可观察对象,避免了在访问原始数据期间的装箱和取消装箱操作。要使用这种机制,需要在Java中创建public 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对象替换可观察的字段,这为我们的应用程序提供了额外的好处。更多信息,请查看当数据更改时使用LiveData通知UI

可观察的集合


有时候我们需要动态结构来持有数据,可观察的集合允许我们使用关键字(key)访问这些结构。当关键字是引用类型时(如String),ObservableArrayMap非常有用,如下所示:

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

在布局中,我们可以通过字符串关键字找到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"/>

当关键字是int类型时可以使用ObservableArrayList,如下所示:

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

在布局中可以通过索引(Index)访问列表,如下所示:

<data>
    <import type="android.databinding.ObservableList"/>
    <import type="com.example.my.app.Fields"/>
    <variable name="user" type="ObservableList&lt;Object&gt;"/>
</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 接口的类允许注册一个监听器,当可观察对象的属性更改时通知这个监听器。

Observable 接口具有添加和删除监听器的机制,但是我们必须决定何时发送通知。为了使开发更简单,DataBinding库提供了BaseObservable类(此类实现了Observable接口),它实现了监听器注册机制。继承了BaseObservable的数据类负责通知属性何时更改。这是通过给 getter 分配一个 Bindable 注解并在 setter 中调用 notifyPropertyChanged() 方法来完成的,如下例所示:

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);
    }
}

数据绑定在模块包中会生成一个名为BR的类,其中包含了用于数据绑定的资源ID,Bindable 注解在编译期间会在BR类中生成一个条目。如果你无法更改数据类的基类,则可以使用PropertyChangeRegistry对象实现Observable接口,以便有效地注册和通知监听器。


本文最近更新日期: 2018年四月26日。

DataBinding使用指南(一):布局和binding表达式

DataBinding使用指南(二):使用可观察的数据对象

DataBinding使用指南(三):生成binding类

DataBinding使用指南(四):BindingAdapter

DataBinding使用指南(五):绑定布局视图到架构组件

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值