Google Data Binding Library 谷歌官方数据绑定库(五) 可观察的数据对象

本文为菜鸟学习笔记兼翻译练习用,翻译可能会不准确,细节请以原文为准,如有不足之处还请见谅,若能斧正,小弟不胜感激。原文地址:Google Data Binding Library

数据对象(Data Objects)

任何POJO对象都可以用于数据绑定, 但是更改一个POJO对象不能引起UI的更新。数据绑定的真正强大之处在于可以给予你的数据对象在数据变化时刷新的能力。DataBinding提供三种不同的数据观察机制:Observable objects,Observable fieldsObservable collections

当上述的其中任意一种可观察数据对象与UI绑定,数据对象属性改变时, UI会自动更新。

Observable Objects

一个实现了Observable接口的类可以绑定一个监听器以监听这个类所有属性的变化。

Observable接口有自己的添加和移除监听器的机制,但是更新的决定权在开发者手里。为了使开发更加简单,BaseObservable这个基类被设计出来以实现监听器的注册机制。当属性发生变化,数据实现类仍然可以可靠的注意到变化。这一功能通过对getter添加Bindable注解和在setter中调用notifying方法完成。

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

Bindable注解在编译期间在BR类文件中创建了一个入口。BR类文件会在module package创建。如果数据类们的基类不能改变,Observable接口会适时使用PropertyChangeRegistry类来高效保存和通知监听器。

ObservableFields

创建Observable类需要一定量的工作,所以想节省时间或使用内容不多的开发者可以考虑使用ObservableField,常见的有以下几种:

 ObservableBoolean, ObservableByte, ObservableChar, ObservableShort, ObservableInt, ObservableLong, ObservableFloat, ObservableDouble和ObservableParcelable。

ObservableField类型是只有一个属性的独立的可观察对象。原始版本在存取过程中避免包装和拆包。使用时,在数据类里创建一个public final属性:

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

这便是我们需要的对象了。存取值的时候使用存取器方法:

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

Observable Collections

一些应用使用更灵活的结构去处理数据。Observable collection类型允许对这些对象进行键控的存取。ObservableArrayMap在键是一个引用类型时非常好用,比如字符串:

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

在布局中,map可以通过String键值进行存取。

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

在布局中,list可以通过索引进行存取。

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

下一篇从Generatd Binding开始翻译。


发布了11 篇原创文章 · 获赞 18 · 访问量 1万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览