1.官方文档
https://developer.android.com/topic/libraries/data-binding/observability
2.observable 属性
适合对象只有少量属性,每个属性用 ObservableField<xxx> 、ObservableInt、ObservableParcelable、ObservableBoolean 等保存。
基本类型 |
|
ObservableBoolean |
ObservableByte |
ObservableChar | ObservableShort |
ObservableInt | ObservableLong |
ObservableFloat |
ObservableDouble |
复杂类型 | |
ObservableParcelable |
ObservableField<非基本类型,如Student> |
ObservableArrayMap |
ObservableArrayList |
2.1 数据源类定义
//2.修改数据动更新ui版本
public class Data { public ObservableInt icon = new ObservableInt();
public ObservableField<String> key = new ObservableField();
public ObservableInt value = new ObservableInt(); @Override
public String toString() {
return "key = " + key + " value = " + value;
}
}
2.2 使用绑定
<TextView
android:id="@+id/key"
android:text='@{data.key, default = "default" }'/> <TextView
android:id="@+id/value"
android:text="@{String.valueOf(data.value),default = value}" /> <ImageView
android:id="@+id/imageView"
app:bindingImgSrc="@{data.icon}" />
2.3 修改数据源对象
@OnClick(R.id.btnSave)
public void onSaveClicked(View view){
//...
data.key.set(newKey);
data.value.set(newValue); int id = main.data.icon.get();
data.icon.set(R.mipmap.girl); }
使用get(),set(xxx) 访问和修改它们。
2.4 ObservableArrayMap
ObservableArrayMap<String, Object> user = new ObservableArrayMap<>();
user.put("firstName", "Google");
user.put("lastName", "Inc.");
user.put("age", );
使用
<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"/>
2.5 ObservableArrayList
ObservableArrayList<Object> user = new ObservableArrayList<>();
user.add("Google");
user.add("Inc.");
user.add();
使用
<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"/>
3.自定义observable对象
- 使用@Bindable修饰get方法
- 在setter方法中使用 notifyPropertyChanged(BR.xxx);
3.1 声明数据类
class Daily : BaseObservable() { @get:Bindable var week =
set(value){
field = value
notifyPropertyChanged(BR.week)
} @get:Bindable var onbed = 0L
set(value){
field = value
notifyPropertyChanged(BR.onbed)
}
@get:Bindable var call =
set(value){
field = value
notifyPropertyChanged(BR.call)
} @get:Bindable var urgent =
set(value){
field = value
notifyPropertyChanged(BR.urgent)
} @get:Bindable var date = ""
set(value){
field = value
notifyPropertyChanged(BR.date)
} var record : List<Record> = ArrayList() }
3.2 使用绑定数据
与2.2一样。
3.3 修改数据对象
@OnClick(R.id.btnSave)
public void onSaveClicked(View view){ //...
data.setKey(newKey);
data.setValue(newValue); data.setIcon(R.mipmap.girl); }
注意:这种方式在java代码中只有调用setXXX才自动更新,data.key = "xxx"不会自动更新。