数据绑定可用于数据对象在数据发生更改时通知其他对象(称为侦听器)。 有三种不同类型的可观察类:对象,字段和集合。
当这些可观察数据对象之一绑定到UI且数据对象的属性更改时,UI将自动更新。
使用通用的Observable类和以下特定于原始的类来使字段可观察:
ObservableBoolean
ObservableByte
ObservableChar
ObservableShort
ObservableInt
ObservableLong
ObservableFloat
ObservableDouble
ObservableParcelable
基本使用
使用时候需要创建一个public final属性,或者使用Kotlin创建一个只读属性,如以下示例所示:
class User {
val firstName = ObservableField<String>()
val lastName = ObservableField<String>()
val age = ObservableInt()
}
要访问该字段值,用set()和get()方法,如下所示:
user.firstName = "Google"
val age = user.age
数组使用
ObservableArrayMap<String, Any>().apply {
put("firstName", "Google")
put("lastName", "Inc.")
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<Any>().apply {
add("Google")
add("Inc.")
add(17)
}
对象使用
为了简化开发,databinding库提供了BaseObservable类,该类实现了侦听器注册机制。 实现BaseObservable的数据类负责通知属性何时更改。 这是通过为getter分配Bindable批注并在setter中调用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)
}
}
databinding在模块包中生成一个名为BR的类,其中包含用于数据绑定的资源的ID。 Bindable注释在编译期间会在BR类文件中生成一个条目。 如果不能更改数据类的基类,则可以使用PropertyChangeRegistry对象来实现Observable接口,以高效地注册和通知侦听器。
网友评论