Android Jetpack架构篇:Data Binding(二)

Android Jetpack架构篇:Data Binding(二)


<spane id="layouts_binding_exp">Work with observable data objects(使用可观察的数据对象)

可观察性是指对象通知其他人数据变化的能力。数据绑定库允许您使对象,字段或集合可观察。

任何普通旧对象都可用于数据绑定,但修改对象不会自动导致UI更新。数据绑定可用于为数据对象提供在数据更改时通知其他对象(称为侦听器)的能力。有三种不同类型的可观察类: 对象,字段和 集合。

当其中一个可观察数据对象绑定到UI并且数据对象的属性发生更改时,UI将自动更新。


Observable fields(可观察的字段)

一些工作涉及创建实现Observable接口的类,如果您的类只有一些属性,那么这些工作是 不值得的。在这种情况下,您可以使用泛型 Observable类和以下特定于原语的类来使字段可观察:

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

可观察字段是具有单个字段的自包含可观察对象。原始版本在访问操作期间避免装箱和拆箱。要使用此机制,请public final在Java编程语言中创建属性或在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()and get()accessor方法,如下所示:

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

注意:Android Studio 3.1及更高版本允许您使用LiveData对象替换可观察字段,这为您的应用提供了额外的好处。有关更多信息,请参阅使用LiveData通知UI有关数据更改的信息。

可观察的集合

一些应用程序使用动态结构来保存数据。可观察集合允许使用密钥访问这些结构。在 ObservableArrayMap 当键是一个引用类型,类是有用的,例如String,如示于下面的例子:

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

在布局中,可以使用字符串键找到地图,如下所示:

<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"/>

在 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接口的类 允许注册希望被通知可观察对象的属性更改的侦听器。

该Observable接口具有添加和删除侦听器的机制,但您必须决定何时发送通知。为了使开发更容易,数据绑定库提供了 BaseObservable实现侦听器注册机制的类。实现的数据类BaseObservable负责通知属性何时更改。这是通过Bindable为getter 分配 注释并notifyPropertyChanged() 在setter中调用 方法来完成的,如以下示例所示:

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编译期间类文件。如果无法更改数据类的基类,则 Observable可以使用PropertyChangeRegistry 对象来实现接口, 以便有效地注册和通知侦听器。



[1] https://developer.android.com/topic/libraries/data-binding/observability

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 导航: 搭建环境 数据绑定编译器V2 数据绑定布局文件编写你的第一套数据绑定表达式数据对象绑定数据事件处理方法参考...
    yyg阅读 2,720评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,323评论 19 139
  • Data Binding 类库 这篇文档将教你如何运用 Data Binding 类库来编写声明试布局,并且尽量减...
    蒹葭流阅读 9,297评论 1 4
  • 本来想把DataBindingLibrary理解完滴,但是由于初学这个,有的也不是很清楚,没有理解的地方,也就是将...
    BrightLight阅读 4,288评论 0 1
  • DataBinding 库是 Google 公司 Android Framework UI 工具团队开发出来的一款...
    bravian阅读 10,749评论 2 16