Data Binding 系列(四)可觀察的數據對象

可觀察的數據對象提供了當數據變化時通知其餘對象的能力。Data Binding 庫提供了使對象、字段和集合可觀察的能力。html

任何的傳統對象均可以用於 Data Binding,可是這些對象數據發生變化時並不能通知 UI 更新。Data Binding 提供了使數據可觀察的方法,就像 Listeners 同樣,它提供了三種可觀察的類:對象(objects)、字段(fileds)和集合(collections)。java

當這些可觀察的數據對象與 UI 綁定後,數據變化時會自動更新 UIandroid

可觀察的字段(observable fields

Data Binding 已經爲咱們寫好了用於觀察基礎類型的類,它們都實現了 Observable 接口:app

使用方法是,在 java 類中建立 public final 屬性,在 kotlin 中建立只讀屬性,以下所示:spa

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

能夠使用 get()set() 方法,訪問這些可觀察字段的值,以下所示:code

user.firstName.set("Google");
int age = user.age.get();
複製代碼

可觀察的集合

對於 key 是引用類型的時候,能夠使用 ObservableArrayMap ,以下所示:htm

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"/>
複製代碼

對於 key 是整型,能夠使用 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 能夠容許外界註冊/移除監聽器,可是變化通知的發送是由咱們本身來控制的。爲了方便咱們開發,Data Binding 提供了 BaseObservable ,它默認實現了監聽器的註冊和移除,咱們能夠直接繼承 BaseObservable ,只負責發送變化通知就好了。變化通知的發送,須要咱們給類屬性的 get() 方法加上 Bindable 註解,並在 set() 方法裏調用 notifyPropertyChanged() 方法,示例以下:接口

class User : BaseObservable() {

    @get:Bindable
    var firstName: String = ""
        set(value) {
            field = value
            notifyPropertyChanged(BR.firstName)
        }

    @get:Bindable
    var lastName: String = ""
        set(value) {
            field = value
            notifyPropertyChanged(BR.lastName)
        }
}
複製代碼

Data Binding 會在編譯時自動生成一個叫作 BR 的類,這個類包含了屬性的 ID。

相關文章
相關標籤/搜索