DataBinding 學習系列(3)新增的可見字段來編寫對象(bean)

前言#

之前主要都是在講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的高級用法。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,283評論 25 708
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,765評論 18 399
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,923評論 18 139
  • 熊小懶閱讀 261評論 0 0
  • 西風烈,北風緊,裹緊的棉襖依然鉆進了冷風,在這個乍冷的冬季,我突然意識到冬來了,時光走了,有些東西也跟著走遠了。 ...
    嫣容淺笑閱讀 289評論 0 3