Android DataBinding (三) Observable

来源:互联网 发布:json遍历里面的数组 编辑:程序博客网 时间:2024/05/19 23:24

Android DataBinding (一) 基本用法
Android DataBinding (二) 事件处理
Android DataBinding (三) Observable (本文)
Android DataBinding (四) 自定义属性
Android DataBinding (五) 自定义 View 的双向绑定
Android DataBinding (六) EditText 绑定 TextChangedListener 和 FocusChangeListener

BaseObservable

ViewModel 的值变化之后,如果需要画面做相应的刷新,那么可以继承 BaseObservable。

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

在 set 方法里面,使用 notifyPropertyChanged 来通知 UI 刷新,notifyPropertyChanged 只会刷新具体的值,notifyChange 方法则会刷新所有的值。
BR 的域则是通过在 get 方法上加 @Bindable 生成的。

Observable Fields

继承自 BaseObservable 的方法有点复杂,DataBinding 还提供了一种简单的写法—-ObservableField。

private static class User {   public final ObservableField<String> firstName =       new ObservableField<>();   public final ObservableField<String> lastName =       new ObservableField<>();   public final ObservableInt age = new ObservableInt();}

直接把属性定义成 ObservableField 类型的,并且修饰符需要是 public final 的。
除了 ObservableField,还可以使用 ObservableBoolean, ObservableByte, ObservableChar, ObservableShort, ObservableInt, ObservableLong, ObservableFloat, ObservableDouble, ObservableParcelable。
访问值得时候,可以使用 get set 方法。

user.firstName.set("Google");int age = user.age.get();

Observable Collections

如果使用 Map,List 等保存数据。DataBinding 也提供了 ObservableArrayMap,ObservableArrayList。

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"/>