android 数据绑定(3)自动更新UI

时间:2022-10-04 22:15:01

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"不会自动更新。