DataBinding 使用指南(一): 布局和绑定表达式 https://blog.csdn.net/guiying712/article/details/80206037
DataBinding 使用指南(二): 使用可观察的数据对象 https://blog.csdn.net/guiying712/article/details/80343247
可观察的字段
可观察的集合
可观察的对象
开篇之前我们首先要理解一个概念, 可观察性 是指什么意思? 可观察性是指当一个对象的数据或状态发生改变时具有通知其他观察者的能力.
DataBinding 库允许我们创建可观察的对象, 字段或集合, 当我们的数据发生改变时需要通知其他对象就可以使用 DataBinding, 它主要有三种不同类型的可观察类型, 分别为: 对象, 字段或集合. 当这些可观察的数据对象绑定到 UI , 并且数据对象的属性发生改变时, UI 也将自动更新. 是不是感觉跟观察者模式的效果一样.
可观察的字段
有时候一些工作会涉及到创建实现了 https://developer.android.google.cn/reference/android/databinding/Observable 接口的类, 但是如果这个类只有几个属性, 我们这样做是又不值得. 在这种情况下, 我们可以使用泛型类 https://developer.android.google.cn/reference/android/databinding/Observable , 以下是基本类型的可观察字段:
- ObservableBoolean
- ObservableByte
- ObservableChar
- ObservableShort
- ObservableInt
- ObservableLong
- ObservableFloat
- ObservableDouble
- ObservableParcelable
Observable 字段是具有单个字段的独立可观察对象, 避免了在访问原始数据期间的装箱和取消装箱操作. 要使用这种机制, 需要在 Java 中创建 public 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( ) https://developer.android.google.cn/reference/android/databinding/ObservableField#set 和 get( ) https://developer.android.google.cn/reference/android/databinding/ObservableField#get 方法访问字段值, 如下所示:
- user.firstName.set("Google");
- int age = user.age.get();
注意: Android Studio 3.1 及更高版本允许我们用 LiveData 对象替换可观察的字段, 这为我们的应用程序提供了额外的好处. 更多信息, 请查看当数据更改时使用 LiveData 通知 UI https://developer.android.google.cn/topic/libraries/data-binding/architecture#livedata .
可观察的集合
有时候我们需要动态结构来持有数据, 可观察的集合允许我们使用关键字 (key) 访问这些结构. 当关键字是引用类型时(如 String), https://developer.android.google.cn/reference/android/databinding/ObservableArrayMap 非常有用, 如下所示:
- ObservableArrayMap<String, Object> user = new ObservableArrayMap<>();
- user.put("firstName", "Google");
- user.put("lastName", "Inc.");
- user.put("age", 17);
在布局中, 我们可以通过字符串关键字找到 Map, 如下所示:
- <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"/>
当关键字是 int 类型时可以使用 https://developer.android.google.cn/reference/android/databinding/ObservableArrayList , 如下所示:
- ObservableArrayList<Object> user = new ObservableArrayList<>();
- user.add("Google");
- user.add("Inc.");
- user.add(17);
在布局中可以通过索引 (Index) 访问列表, 如下所示:
- <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"/>
可观察的对象
实现了 https://developer.android.google.cn/reference/android/databinding/Observable 接口的类允许注册一个监听器, 当可观察对象的属性更改时通知这个监听器.
https://developer.android.google.cn/reference/android/databinding/Observable 接口具有添加和删除监听器的机制, 但是我们必须决定何时发送通知. 为了使开发更简单, DataBinding 库提供了 https://developer.android.google.cn/reference/android/databinding/BaseObservable 类(此类实现了 Observable 接口), 它实现了监听器注册机制. 继承了 BaseObservable 的数据类负责通知属性何时更改. 这是通过给 getter 分配一个 https://developer.android.google.cn/reference/android/databinding/Bindable 注解并在 setter 中调用 notifyPropertyChanged() https://developer.android.google.cn/reference/android/databinding/BaseObservable#notifyPropertyChanged(int) 方法来完成的, 如下例所示:
- 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, https://developer.android.google.cn/reference/android/databinding/Bindable 注解在编译期间会在 BR 类中生成一个条目. 如果你无法更改数据类的基类, 则可以使用 https://developer.android.google.cn/reference/android/databinding/PropertyChangeRegistry 对象实现 https://developer.android.google.cn/reference/android/databinding/Observable 接口, 以便有效地注册和通知监听器.
来源: https://juejin.im/entry/5afe4930f265da0ba46a0781