可观察的数据对象提供了当数据变化时通知其余对象的能力。Data Binding
库提供了使对象、字段和集合可观察的能力。html
任何的传统对象均可以用于 Data Binding
,可是这些对象数据发生变化时并不能通知 UI
更新。Data Binding
提供了使数据可观察的方法,就像 Listeners
同样,它提供了三种可观察的类:对象(objects
)、字段(fileds
)和集合(collections
)。java
当这些可观察的数据对象与 UI
绑定后,数据变化时会自动更新 UI
。android
observable fields
)Data Binding
已经为咱们写好了用于观察基础类型的类,它们都实现了 Observable
接口:app
ObservableBoolean
ObservableByte
ObservableChar
ObservableShort
ObservableInt
ObservableLong
ObservableFloat
ObservableDouble
ObservableParcelable
使用方法是,在 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。