Android DataBinding (一) 基本用法
Android DataBinding (二) 事件處理
Android DataBinding (三) Observable (本文)
Android DataBinding (四) 自定義屬性
Android DataBinding (五) 自定義 View 的雙向綁定
Android DataBinding (六) EditText 綁定 TextChangedListener 和 FocusChangeListener
BaseObservable
ViewModel 的值變化之后,如果需要畫(huà)面做相應(yīng)的刷新,那么可以繼承 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 來(lái)通知 UI 刷新毒姨,notifyPropertyChanged 只會(huì)刷新具體的值衣陶,notifyChange 方法則會(huì)刷新所有的值财饥。
BR 的域則是通過(guò)在 get 方法上加 @Bindable 生成的墩衙。
Observable Fields
繼承自 BaseObservable 的方法有點(diǎn)復(fù)雜务嫡,DataBinding 還提供了一種簡(jiǎn)單的寫(xiě)法----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 類(lèi)型的,并且修飾符需要是 public final 的心铃。
除了 ObservableField准谚,還可以使用 ObservableBoolean, ObservableByte, ObservableChar, ObservableShort, ObservableInt, ObservableLong, ObservableFloat, ObservableDouble, ObservableParcelable。
訪問(wèn)值得時(shí)候去扣,可以使用 get set 方法柱衔。
user.firstName.set("Google");
int age = user.age.get();
Observable Collections
如果使用 Map,List 等保存數(shù)據(jù)愉棱。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"/>