在之前我們做了一個簡單的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>方法将資料實體與它綁定。
你可以從我們的例子中初步看出資料綁定的效果:
這一切都運作的非常好,就是一個含有三個子view的布局被綁定了,data binding看起來也沒為我們省去很多工作,也隻是省去了findview與<code>settext()</code>兩個操作而已。但是它所能做的并不僅僅是這樣!可能有人注意到了我們同時從twitter的api中擷取了頭像的url,layout中我們沒有對<code>imageview</code>進行綁定。在下一章中我們将會引入glide來加載圖像,并将它與data
binding結合起來。