Android 官方架构组件-数据绑定Observable

2019-10-28  本文已影响0人  R7_Perfect

数据绑定可用于数据对象在数据发生更改时通知其他对象(称为侦听器)。 有三种不同类型的可观察类:对象,字段和集合。

当这些可观察数据对象之一绑定到UI且数据对象的属性更改时,UI将自动更新。

使用通用的Observable类和以下特定于原始的类来使字段可观察:

基本使用

使用时候需要创建一个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的使用:

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的使用

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接口,以高效地注册和通知侦听器。

上一篇下一篇

猜你喜欢

热点阅读