Data Binding Library官網(wǎng)文檔翻譯 3 - 使用可觀察數(shù)據(jù)

Work with observable data objects - 使用可觀察的數(shù)據(jù)對象

這一篇是整個系列的第三篇翻譯,像上一篇一樣,翻譯不準(zhǔn)確的地方歡迎大家批評指正。同樣附上官網(wǎng)鏈接。同時,轉(zhuǎn)載請注明出處,http://m.itdecent.cn/p/210f9331f3b2

首先解釋一下什么是可觀察性,他指的是一個對象在他的data數(shù)據(jù)變化時可以通知別人的能力。data binding可以幫助你創(chuàng)建可觀察的對象,變量和集合。

Data binding當(dāng)然也可以使用老式的對象,但是這樣的話修改對象時不會自動的修改UI。data binding賦予了數(shù)據(jù)對象在數(shù)據(jù)變化時,通知別的對象的能力(這里的被通知的對象就是Listener)。

Data binding中一共有三種不同類型的可觀察類: objects, fields, 和 collections.。當(dāng)一個可觀察數(shù)據(jù)對象綁定到UI,并且數(shù)據(jù)對象的屬性發(fā)生變化時,UI將自動更新。

1. Observable fields 可觀察的類變量

實(shí)現(xiàn)Observable接口需要額外的工作量。如果你的數(shù)據(jù)類中只有少數(shù)幾個屬性,那么這種方式是不值得的。在這種情況下,您可以使用以下的類,來創(chuàng)建可觀察字段:

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

Observable fields是具有單個字段的自包含可觀察對象。原始版本在訪問操作期間避免裝箱和拆箱。要使用此機(jī)制,請在Java中創(chuàng)建 public final 的屬性,或在Kotlin中創(chuàng)建只讀屬性,如以下示例所示:

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 fields,還帶來了額外的好處。有關(guān)更多信息,請參閱Use LiveData to notify the UI about data changes。


2. Observable collections 可觀察集合

一些應(yīng)用程序使用動態(tài)結(jié)構(gòu)來保存數(shù)據(jù)??捎^察集合允許使用key訪問這些結(jié)構(gòu)。當(dāng)key是引用類型(如String)時,ObservableArrayMap類非常有用,如以下示例所示

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

// layout中的使用
<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"/>

下面再舉一個例子,當(dāng)key時integer類時,我們可以使用ObservableArrayList

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

// layout中可以使用通過index來訪問對應(yīng)數(shù)據(jù)
<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"/>

3. Observable objects 可觀察的對象

實(shí)現(xiàn)Observable接口的類,允許注冊一個在Observable objects的屬性更改時可以被通知到的Listener。

Observable接口本身有添加移除監(jiān)聽器的機(jī)制,但是你必須決定何時發(fā)送通知。

為了使用方便,Data Binding Library提供了BaseObservable類,這個類已經(jīng)實(shí)現(xiàn)了監(jiān)聽器的注冊機(jī)制。實(shí)現(xiàn)了BaseObservable接口的數(shù)據(jù)類,需要在屬性變化的時候進(jìn)行通知。

通過下面的例子可以了解到,這是通過在get方法中使用@Bindable注解,set方法中使用notifyPropertyChanged()實(shí)現(xiàn)的。

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

Data binding會在module package中生成一個BR文件,包含了所有data binding中使用到的資源id。Bindable注解會在編譯的時候在BR類中生成一個entry。如果數(shù)據(jù)類的基類無法修改,則可以使用PropertyChangeRegistry對象實(shí)現(xiàn)Observable接口,以有效地注冊和通知偵聽器。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容