(译) Data Binding 使用可观察的数据对象

原文链接

可观察性指的是一个对象通知其它对象它数据发生变化的能力。数据绑定库能让你使对象(objects),域(fields)、以及集合(collections)变得可观察。

任何普通的对象都能用于数据绑定,但是修改对象并不会自动导致UI的更新。数据绑定可以被用来给予你的数据对象通知其他对象的能力,例如,当它的数据发生改变时的监听器。有三种不同类型的可观察类:objects , fields 以及 collections

当这些可观察数据对象绑定到界面,数据对象的一个属性发生变化,界面就会自动更新。

可观察的域(fields)

在创建实现 Observable 接口的类的时候是有一定工作量的,如果你的类中只有少量几个属性是得不偿失的。在这种情形下,你可以使用通用的可观察类以及以下的基础类来是域变得可观察:

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

可观察域是有单个域的自给自足的可观察对象。基础版本避免了访问操作的装箱和拆箱。为了使用这个机制,创建一个公开的final属性,如下例子所示:

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

为了访问域的值,使用set()和get()的存取方法,如下所示:

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

注意:在Android Studio 3.1以及更高版本上,你可以使用LiveData对象替代Observable域,它能够为你的应用带来额外的好处。想要知道跟多的信息,查看使用LiveDtat通知UI数据发生了变化。

可观察的集合

一些应用使用动态结构来持有数据。可观察的集合允许通过key来访问这些结构。ObservableArrayMap 类在key是一个引用类型的十分有用的,例如String,如以下的例子所示:

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

在布局中,map可用用字符串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是整形的时候,ObservableArrayList 是很有用的,如下:

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

在布局中,列表能够通过索引访问,如下例所示:

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 接口的类,允许注册当可观察对象的属性发生变化的监听器。为了使开发变得简单,DataBinding 库提供了 BaseObservable 类,它实现了监听注册机制。这个实现BaseObservable 的数据类是负责在属性改变的时候进行通知的。这是通过赋值一个Bindable 对象到 getter 以及在 setter 对象中调用 notifyProperytyChanged(),如下例所示:

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)
}
}

在模块包中,Data binding 生成了一个名叫 BR 的类,这个类包含了用做数据绑定的资源id。Bindable 注解在编译时在BR类文件中生成了一个入口。如果用于数据的基础类不能发生改变,Observable 接口可以通过使用一个 PropertyChangeRegistry 对象来有效地注册和通知监听器的方式实现。

非典型前端coder wechat
想要随时Follow我的最新博客,可扫码关注我的公众号