android 數據綁定(3)自動更新UI


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 數據源類定義

 1 //2.修改數據動更新ui版本
 2 public class Data {
 3 
 4     public ObservableInt            icon    = new ObservableInt();
 5     public ObservableField<String>  key     = new ObservableField();
 6     public ObservableInt            value   = new ObservableInt();
 7 
 8     @Override
 9     public String toString() {
10         return "key = " + key + " value = " + value;
11     }
12 }

2.2 使用綁定

 1         <TextView
 2             android:id="@+id/key"
 3             android:text='@{data.key, default = "default" }'/>
 4 
 5         <TextView
 6             android:id="@+id/value"
 7             android:text="@{String.valueOf(data.value),default = value}" />
 8 
 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);
 6 
 7         int id = main.data.icon.get();
 8         data.icon.set(R.mipmap.girl);
 9   
10     }

  使用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="android.databinding.ObservableMap"/>
 3     <variable name="user" type="ObservableMap<String, Object>"/>
 4 </data>
 5  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>
 6  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() {
 2 
 3     @get:Bindable var week          = 0
 4         set(value){
 5             field = value
 6             notifyPropertyChanged(BR.week)
 7         }
 8 
 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         }
19 
20     @get:Bindable var urgent        = 0
21         set(value){
22             field = value
23             notifyPropertyChanged(BR.urgent)
24         }
25 
26     @get:Bindable var date          = ""
27         set(value){
28             field = value
29             notifyPropertyChanged(BR.date)
30         }
31     
32     var record      : List<Record> = ArrayList()
33   
34 }

3.2 使用綁定數據

  與2.2一樣。

3.3 修改數據對象

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

  注意:這種方式在java代碼中只有調用setXXX才自動更新,data.key = "xxx"不會自動更新

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM