可观察性是指对象通知其他人数据变化的能力。 数据绑定库允许您使对象,字段或集合可观察。
任何普通旧对象都可用于数据绑定,但修改对象不会自动导致UI更新。 数据绑定可用于为数据对象提供在数据更改时通知其他对象(称为侦听器)的能力。 有三种不同类型的可观察类:对象,字段和集合。
当其中一个可观察数据对象绑定到UI并且数据对象的属性发生更改时,UI将自动更新。
一、可观察的字段
一些工作涉及创建实现Observable接口的类,如果您的类只有几个属性,那么这些工作是不值得的。 在这种情况下,您可以使用通用Observable类和以下特定于原语的类来使字段可观察:
ObservableBoolean
ObservableByte
ObservableChar
ObservableShort
ObservableInt
ObservableLong
ObservableFloat
ObservableDouble
ObservableParcelable
可观察字段是具有单个字段的自包含可观察对象。 原始版本在访问操作期间避免装箱和拆箱。 要使用此机制,请在Java编程语言中创建公共final属性,或在Kotlin中创建只读属性,如以下示例所示:
private static class User {
public final ObservableField<String> firstName = new ObservableField<>();
public final ObservableField<String> lastName = new ObservableField<>();
public final ObservableInt age = new ObservableInt();
}
要访问字段值,请使用set()和get()访问器方法,如下所示:
user.firstName.set("Google");
int age = user.age.get();
注意:Android Studio 3.1及更高版本允许您使用LiveData对象替换可观察字段,这为您的应用提供了额外的好处。 有关更多信息,请参阅使用LiveData通知UI有关数据更改的信息。
可观察的集合
一些应用程序使用动态结构来保存数据。 可观察集合允许使用密钥访问这些结构。 当键是引用类型(如String)时,ObservableArrayMap类很有用,如以下示例所示:
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"/>
当键是整数时,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接口有一个添加和删除侦听器的机制,但您必须决定何时发送通知。 为了简化开发,数据绑定库提供了BaseObservable类,该类实现了侦听器注册机制。 实现BaseObservable的数据类负责通知属性何时更改。 这是通过将一个Bindable注释分配给getter并在setter中调用notifyPropertyChanged()
方法来完成的,如以下示例所示:
private static class User extends BaseObservable {
private String firstName;
private String lastName;
@Bindable
public String getFirstName() {
return this.firstName;
}
@Bindable
public String getLastName() {
return this.lastName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
notifyPropertyChanged(BR.firstName);
}
public void setLastName(String lastName) {
this.lastName = lastName;
notifyPropertyChanged(BR.lastName);
}
}
数据绑定在模块包中生成一个名为BR的类,该类包含用于数据绑定的资源的ID。 Bindable注释在编译期间在BR类文件中生成一个条目。 如果无法更改数据类的基类,则可以使用PropertyChangeRegistry对象实现Observable接口,以有效地注册和通知侦听器。
网友评论