DataBinding - 使用可观察的数据对象

什么是可观察对象

注:本文参考并翻译自官网链接


  • 可观察性是指对象具备通知外部其数据发生变化的能力。Databinding 支持对象、字段或集合的可观察。

  • 当其中一个可观察数据对象绑定到UI并且数据对象的属性发生更改时,UI将自动更新。

可观察的类型

任何普通对象都可用于数据绑定,但修改对象不会自动导致UI更新。Databinding 可用于为数据对象提供在数据更改时通知其他对象(称为侦听器)的能力。有三种不同类型的可观察类: 对象,字段和 集合。

可观察字段

有时候你的类中如果有一些需要更新的字段,并且只包含以下这些属性,那么可以直接使用系统的实现,而不需要重新实现。这时候,你字需要使用可观察对象作为其字段,或者直接使用可观察字段。

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

可观察字段是具有单个字段的自包含可观察对象。原始版本在访问操作期间避免装箱和拆箱。要使用此机制,请public final在 Java 编程语言中创建属性或在 Kotlin 中创建只读属性,如以下示例所示:

1
2
3
4
5
class User {
val firstName = ObservableField<String>()
val lastName = ObservableField<String>()
val age = ObservableInt()
}

要访问字段值,请使用 set() and get() 方法,如下所示

1
2
user.firstName = "Google"
val age = user.age

Note: Android Studio 3.1 and higher allow you to replace observable fields with LiveData objects, which provide additional benefits to your app. For more information, see Use LiveData to notify the UI about data changes.

可观察集合

  • 可以使用可观察的集合,来存放一些列的数据。通过示例来使用 ObservableArrayMap 类:

    1
    2
    3
    4
    5
    ObservableArrayMap<String, Any>().apply {
    put("firstName", "Google")
    put("lastName", "Inc.")
    put("age", 17)
    }

    在布局文件中,可以直接使用 key 去拿到这个存储的值:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <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 是无序的 int 时,可以使用 ObservableArrayList 类。

    1
    2
    3
    4
    5
    ObservableArrayList<Any>().apply {  
    add("Google")
    add("Inc.")
    add(17)
    }

    在 layout 文件中,可以直接通过索引的方式获取:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <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 接口具有添加和删除侦听器的机制,但您必须决定何时发送通知。为了使开发更容易,Databinding 库提供了 BaseObservable 实现侦听器注册机制的类。实现了 BaseObservable 的类,负责在属性更改时发出通知。这是通过 Bindable 为 getter 添加注解,并在 setter 中调用 notifyPropertyChanged() 方法来完成的,如以下示例所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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命名的类,该类包含用于 Databinding 的资源的ID。 Bindable 注解会在编译期生成一个 BR类 中的的条目。如果无法更改数据类的基类,则 Observable可以使用PropertyChangeRegistry 对象来实现接口, 以便有效地注册和通知侦听器。

-------------本文结束感谢您的阅读-------------
坚持原创技术分享,您的支持将鼓励我继续创作!