(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<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行手动更新