天天看點

資料綁定(data binding)2

在之前我們做了一個簡單的twitter用戶端,但是簡單地介紹viewholder實作,可能沒有充分地讓你明白data binding的使用方法。那麼我們現在就來看看怎麼樣将data binding引入到項目中。

首先我們要在工程目錄下的gradle腳本添加依賴:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

buildscript {

    repositories {

        jcenter()

    }

    dependencies {

        classpath 'com.android.tools.build:gradle:1.3.0'

        classpath "com.android.databinding:databinder:1.0-rc1"

}

allprojects {

在要在使用data binding的module下的gradle腳本中添加依賴:

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

applyplugin:'com.android.application'

applyplugin:'com.android.databinding'

android{

    compilesdkversion23

    buildtoolsversion"23.0.0"

    defaultconfig{

        applicationid"com.stylingandroid.databinding"

        minsdkversion7

        targetsdkversion23

        versioncode1

        versionname"1.0"

        buildconfigfield'string','twitter_consumer_key',"\"${twitterconsumerkey}\""

        buildconfigfield'string','twitter_consumer_secret',"\"${twitterconsumersecret}\""

        buildconfigfield'string','twitter_access_key',"\"${twitteraccesskey}\""

        buildconfigfield'string','twitter_access_secret',"\"${twitteraccesssecret}\""

    buildtypes{

        release{

            minifyenabledfalse

            proguardfilesgetdefaultproguardfile('proguard-android.txt'),'proguard-rules.pro'

        }

    packagingoptions{

        exclude'meta-inf/license.txt'

    lintoptions{

        disable'invalidpackage'

dependencies{

    compile'com.android.support:support-annotations:23.0.0'

    compile'com.android.support:design:23.0.0'

    compile'com.android.support:appcompat-v7:23.0.0'

    compile'com.android.support:recyclerview-v7:23.0.0'

    compile'org.twitter4j:twitter4j-core:4.0.4'

    compile'org.twitter4j:twitter4j-async:4.0.4'

    compile'com.github.bumptech.glide:glide:3.6.1'

你會發現在後面這個gradle腳本中沒有添加data binding依賴——它實際上隻是在建構項目的時候附加的工具。

你應該在這個操作方法中領悟到一些東西:實際上data binding隻是一個代碼生成工具,它會在build項目的時候生成一些綁定view和資料對象的模闆代碼。

在我們的例子中,它解析目标是layout/status_item.xml中的節點。根據布局檔案的檔案名,它會自動生成一個資料綁定類<code>statusitembinding</code>,我們在<code>statusviewholder</code>使用的就是這個神秘的類。

之後data binding将包裝去掉,由于在<code>statusitembinding</code>類中已經解析出了屬性,它同時也會移除節點,隻剩下<code>relativelayout</code>。換句話說,它将這個檔案變回了普通的xml

layout檔案,并添加了一個資料綁定類實時更新其中的内容。

我們再重溫一下<code>statusviewholder</code>的代碼,現在應該明白一點它的運作機制了吧:

publicclassstatusviewholderextendsrecyclerview.viewholder{

    privatestatusitembindingbinding;

    publicstatusviewholder(viewitemview){

        super(itemview);

        binding=databindingutil.bind(itemview);

    publicvoidbind(statusstatus){

        binding.setstatus(status);

<code>databindingutil.bind(itemview)</code>方法會在build的時候自動生成。這時候我們需要做的是在<code>bind(status status)</code>中調用<code>statusitembinding</code>的setter方法,将我們在中聲明的資料對象(<code>.data.status</code>)指派給它。之後我們要顯式地調用<code>bind(status status)</code>方法将資料實體與它綁定。

你可以從我們的例子中初步看出資料綁定的效果:

資料綁定(data binding)2

這一切都運作的非常好,就是一個含有三個子view的布局被綁定了,data binding看起來也沒為我們省去很多工作,也隻是省去了findview與<code>settext()</code>兩個操作而已。但是它所能做的并不僅僅是這樣!可能有人注意到了我們同時從twitter的api中擷取了頭像的url,layout中我們沒有對<code>imageview</code>進行綁定。在下一章中我們将會引入glide來加載圖像,并将它與data

binding結合起來。

繼續閱讀