前言#
之前主要都是在講DataBinding在xml中的使用,基本上滿足了大部分的需求了,但是不能放下前進的腳步,了解和使用DataBinding中的可見字段,絕對是一件錦上添花的事情。
實戰(zhàn)#
首先來看一下之前的User代碼
/**
* Created by li.zhipeng on 2017/2/10.
*
* 測試用的User類
*/
public class User {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
非常簡單的User類,只有一個name屬性。如果有一種情況,如果User的name在設置了之后,又發(fā)生了變化,我需要更新顯示的name的View,怎么辦?
這樣的代碼已經達不到我們需要的效果,所以我要借助DataBinding中的BaseObservable接口。
/**
* Created by li.zhipeng on 2017/2/10.
*
* 測試用的User類
*/
public class User extends BaseObservable {
@Bindable
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
notifyPropertyChanged(BR.name);
// notifyChange();
}
}
從上面的代碼看出,集成了BaseObservable接口之后,出現(xiàn)了三個新的方法:
notifyChange() :對象已經發(fā)生改變,所有綁定過該對象的view都需要刷新。
notifyPropertyChanged(BR.name) : 對象的某一個屬性發(fā)生了改變,通過使用了這個屬性的view進行更新。
@Bindable : 把某一個對象的屬性綁定到BR文件中,代碼中對name進行了綁定,所以在BR中就出現(xiàn)了BR.name, 來直接找到這個屬性。
這樣就已經達到了我們想要的效果,其實DataBingding除了提供了可見接口來幫助我們實現(xiàn)這種效果,還提供了可見字段:
ObservableBoolean, ObservableByte, ObservableChar 等基本數(shù)據(jù)類型,還包括對象類型ObservableField<T>等。
可見字段是獨立字段的可見對象,原始版本在訪問操作中避免裝箱和拆箱,為方便使用,在數(shù)據(jù)類創(chuàng)建中使用 pulic final。
下面來再次修改User的代碼:
/**
* Created by li.zhipeng on 2017/2/10.
*
* 測試用的User類
*/
public class User{
public final ObservableField<String> name = new ObservableField<>();
}
非常的簡潔,看上去應該是對String進行了一次包裝,使用起來非常簡便。
可見集合#
在提供了基本字段以外,還提供了可見集合:
ObservableArrayMap和ObservableArrayList。
使用方法
ObservableArrayMap<String, Object> userMap = new ObservableArrayMap<>();
userMap.put("firstName", "Google");
userMap.put("lastName", "Inc.");
userMap.put("age", 17);
<data>
<import type="android.databinding.ObservableMap"/>
<import type="com.example.my.app.Fields"/>
<variable name="user" type="ObservableMap<String, 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["age"])}'
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
ObservableArrayList<Object> userList = new ObservableArrayList<>();
userList.add("Google");
userList.add("Inc.");
userList.add(17);
<data>
<import type="android.databinding.ObservableList"/>
<variable name="user" type="ObservableList<Object>"/>
</data>
…
<TextView
android:text='@{user[0]}'
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:text='@{String.valueOf(1 + (Integer)user[2])}'
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
我們隊上面的使用進行一下總結:
1、在java代碼中,沒有變化,使用方法和普通的HashMap、ArrayList沒有區(qū)別。
2、在xml中,ObservableArrayMap可以根據(jù)索引key來獲取集合中的對象,ObservableList可以通過坐標來獲取對象。
3、手動引入了Field類,所以能夠在xml中使用Field中的靜態(tài)成員變量LAST_NAME,默認引入了java.lang.*,所以能夠直接使用String的靜態(tài)方法。
4、可以在xml進行強制轉換。
總結#
DataBinding中的可見接口和字段,我們都已經掌握的差不多了,使用DataBinding將會更加輕松, 代碼可會更加簡潔,下一篇就講一下DataBinding的高級用法。