2 public class Data { 4 public ObservableInt icon = new ObservableInt(); 5 public ObservableField<String> key = new ObservableField(); 6 public ObservableInt value = new ObservableInt(); 8 @Override 9 public String toString() { 10 return " key = " + key + " value = " + value; 11 }

2.2 使用绑定

 1         <TextView
 2             android:id="@+id/key"
 3             android:text='@{data.key, default = "default" }'/>
 5         <TextView
 6             android:id="@+id/value"
 7             android:text="@{String.valueOf(data.value),default = value}" />
 9         <ImageView
10             android:id="@+id/imageView"
11             app:bindingImgSrc="@{data.icon}" />

2.3 修改数据源对象

 1     @OnClick(R.id.btnSave)
 2     public void onSaveClicked(View view){
 3         //...
 4         data.key.set(newKey);
 5         data.value.set(newValue);
 7         int id = main.data.icon.get();
 8         data.icon.set(R.mipmap.girl);

  使用get(),set(xxx) 访问和修改它们。

2.4 ObservableArrayMap

1 ObservableArrayMap<String, Object> user = new ObservableArrayMap<>();
2 user.put("firstName", "Google");
3 user.put("lastName", "Inc.");
4 user.put("age", 17);
 1 <data>
 2     <import type="androidx.databinding.ObservableMap"/>
 3     <variable name="user" type="ObservableMap&lt;String, Object>"/>
 4 </data>
 6 <TextView
 7     android:text="@{user.lastName}"
 8     android:layout_width="wrap_content"
 9     android:layout_height="wrap_content"/>
10 <TextView
11     android:text="@{String.valueOf(1 + (Integer)user.age)}"
12     android:layout_width="wrap_content"
13     android:layout_height="wrap_content"/>

2.5 ObservableArrayList

1 ObservableArrayList<Object> user = new ObservableArrayList<>();
2 user.add("Google");
3 user.add("Inc.");
4 user.add(17);
 1 <data>
 2     <import type="android.databinding.ObservableList"/>
 3     <import type="com.example.my.app.Fields"/>
 4     <variable name="user" type="ObservableList<Object>"/>
 5 </data>
 7 <TextView
 8     android:text='@{user[Fields.LAST_NAME]}'
 9     android:layout_width="wrap_content"
10     android:layout_height="wrap_content"/>
11 <TextView
12     android:text='@{String.valueOf(1 + (Integer)user[Fields.AGE])}'
13     android:layout_width="wrap_content"
14     android:layout_height="wrap_content"/>

3.自定义observable对象

  • 使用@Bindable修饰get方法
  • 在setter方法中使用 notifyPropertyChanged(BR.xxx);
  • 3.1 声明数据类

     1 class Daily : BaseObservable() {
     3     @get:Bindable var week          = 0
     4         set(value){
     5             field = value
     6             notifyPropertyChanged(BR.week)
     9     @get:Bindable var onbed         = 0L
    10         set(value){
    11             field = value
    12             notifyPropertyChanged(BR.onbed)
    13         }
    14     @get:Bindable var call          = 0
    15         set(value){
    16             field = value
    17             notifyPropertyChanged(BR.call)
    18         }
    20     @get:Bindable var urgent        = 0
    21         set(value){
    22             field = value
    23             notifyPropertyChanged(BR.urgent)
    24         }
    26     @get:Bindable var date          = ""
    27         set(value){
    28             field = value
    29             notifyPropertyChanged(BR.date)
    30         }
    32     var record      : List<Record> = ArrayList()
    

    3.2 使用绑定数据

      与2.2一样。

    3.3 修改数据对象

     1     @OnClick(R.id.btnSave)
     2     public void onSaveClicked(View view){
     4         //...
     5         data.setKey(newKey);
     6         data.setValue(newValue);
     8         data.setIcon(R.mipmap.girl);
    

      注意:这种方式在java代码中只有调用setXXX才自动更新,data.key = "xxx"不会自动更新

    4.伴生对象成员不支持自动更新?

     1 class Data(): BaseObservable() {
     3     @get:Bindable
     4     var name    =   "unknown_"
     5         set(value) {
     6             field = value
     7             notifyPropertyChanged(BR.name)
    10     companion object : BaseObservable(){
    11         @get:Bindable
    12         @JvmStatic var value   =   0
    13             set(value) {
    14                 field = value
    15                 notifyPropertyChanged(BR.value)
    16             }
    17     }
    

      Data类的伴生对象的成员value,也可以 get:Bindable ,notifyPropertyChanged(BR.value) 等声明为绑定自动通知更新,要求伴生对象的主类也要继承BaseObservable,否则编译不过。

      但是实际调用后,发现并没有自动更新:

    1     val checkedListener  =  object  : CompoundButton.OnCheckedChangeListener {
    2         override fun onCheckedChanged(p0: CompoundButton?, p1: Boolean) {
    3             Data.value = 100
    4             //binding.invalidateAll()
    

      解决办法: 打开 第4行手动更新