阿里P7移動互聯網架構師進階視頻(每日更新中)免費學習請點擊:https://space.bilibili.com/474380680
前言:
2015年谷歌I/O大會上介紹了一個數據綁定框架DataBinding。2016年,2017年毫無意外成了項目實戰中主流框架。使用它我們可以輕松實現MVVM(模型-視圖-視圖模型)模式,來實現應用之間數據與視圖的分離、視圖與業務邏輯的分離、數據與業務邏輯的分離,從而達到低耦合、可重用性、易測試性等好處。而使用DataBinding不僅減少了findViewById的出現頻率,而且還大大提高解析XML的速度。
1 . 基本使用
新建一個項目,在app的build文件加上:
構建環境特別簡單,接下來直接開始使用數據綁定
首先,新建一個User.java實體類:
之后看下布局(activity_basic.xml),跟傳統的布局不一樣,這里需要使用<layout></layout>作為根節點,在<layout>節點中我們可以通過<data>節點來引入我們要使用的數據源
注意 :
※ 切記,在<layout>節點下是沒有“layout_width”和“layout_height”的
※ type中聲明的就是我們的用戶實體類User,連同包名一定要寫全!!!我們給其命名(name)為“user”,然后在TextView中的@{user.name}就是把這個user中的名字展示出來,之后的“age””myBlog”同理
※ age年齡在實體類User中我們定義的是整數類型,所以在布局中需要使用String.valueOf(user.age)轉換為字符串
一個Binding類會基於layout文件的名稱而產生,並且添加“Binding”后綴。上述的layout文件是main_basic.xml,因此生成的類名是ActivityBasicBinding。通過DataBindingUtil.setContentView獲取bing實例,進行數據綁定
運行之后看下效果圖
2 . 顯示照片
看完圖之后,我們看下如何實現。
我們選擇用glide加載一張網絡圖片。glide怎么在studio中使用,這里就不再討論。如何顯示一張網絡圖片,需要使用到DataBinding自定義屬性@BindingAdapter。在布局文件中使用這個自定義屬性,顯示出我們要展示的布局。
還是那個實體類User,添加自定義屬性@BindingAdapter({"imageUrl"})
※ 這里要主要的是,imageLoader方法必須聲明是static,否則會報錯。
新建activity_image.xml,因為使用了自定義屬性,所以在layout節點下要添加xmlns:app="http://schemas.android.com/apk/res-auto"。在ImageView中使用app:imageUrl="@{user.imageUrl}"。完整代碼如下:
最后運行之后,結果如上圖。我就不再發一遍了,有興趣的朋友再拖回去看一遍,反正下面還有~~
3 . 更多用法
簡單的字符拼接
簡單的三目運算
判斷名字是否為空,不為空只顯示user.name,否則顯示donkor11:
相當於
這里需要注意的是當{}中使用了雙引號“”,最外層要改成單引號”
根據數據判斷,顯示數據
判斷是否為學生,是則顯示11,反則,顯示00
**修改樣式 **
判斷是否為學生,是則修改背景顏色0xFF0000FF,反則,顯示0xFFFF0000
寫在之后的話,這里我們需要知道Databinding支持與不支持的表達式,語法。如下
支持的表達式:
1.Mathematical + - / * %
2.String concatenation +
3.Logical && ||
4.Binary & | ^
5.Unary + - ! ~
6.Shift >> >>> <<
7.Comparison == > < >= <=
8.instanceof
9.Grouping ()
10.Literals - character, String, numeric, null
11.Cast
12.Method calls
13.Field access
14.Array access []
15.Ternary operator ?:
不支持的表達式:
1.this
2.super
3.new
4.Explicit generic invocation
最后運行之后,看下效果圖。
4 . 點擊事件
單擊事件
單擊事件在實際開發中,使用頻率有多高這里就不解釋了。下面我們直接看怎么用
在data節點下的variable下type引用android.view.View.OnClickListener。
Button按鈕直接引用”myClick”
長按事件
長按事件的button,首先需要分配一個id給Button
在Activity中,使用數據綁定,直接引用按鈕id。完整代碼如下
最后運行之后,看下效果圖。
▲5 . 綁定ListView
Listview在實際開發中使用頻率同樣很高,看了上面那么多例子。就知道Databinding綁定ListView一樣簡單。接下來看一組美圖。
看完之后,能看出布局其實就是一張ImageView,底下加一個TextView。例子很簡單 ,然后看下如何實現。首先需要新建一個美女的實體類,我們先定義Beauty,beautyNum就是美女底下的TextView文本。
然后看下主布局activity_listview.xml,在data節點下的variable下type引用android.widget.BaseAdapter。
然后ListView的item布局item_listview.xml,同樣比較簡單,在這不做解釋。
有ListView的地方,十有八九就有適配器。這里介紹一個終極適配器的寫法MyBaseAdapter。盡管這里僅僅是給美女使用的適配器,但是已經說明了是終極寫法。我們就不叫它美女適配器了。
然后解釋下其中幾個變量
Context context:上下文,不比多說
List list:傳進來的數據集合,不解釋
int layoutId: item布局的資源id
int variableId:系統自動生成的
※ 注意布局加載方式為DataBindingUtil類中的inflate方法
最后看下ListViewActivity完整代碼
最后運行之后,結果如上圖。有興趣的朋友再拖回去看一遍,反正下面沒有美女了~~
6 . 數據更新
Databinding的數據更新同樣惹人喜歡。最主要的是代碼簡潔明了,UI還同步更新。
首先看下效果圖
數據更新可以使用如下兩種方式,分別對學生文本和老師文本進行修改
讓實體類(Student)繼承自BaseObservable
給需要改變的字段的get方法添加上@Bindable注解,然后給需要改變的字段(例如name)的set方法加上notifyPropertyChanged(BR.name);字段number同理,在set方法內加上notifyPropertyChanged(BR.number);
** 使用DataBinding提供的ObservableFields來創建實體類**
Teacher實體類,這個更加簡單,幾行代碼搞定
然后看下布局文件activity_data_notify代碼,跟上文描述的基本類似,這里不再過多贅述。
最后看下DataNotifyActivity完整代碼
7 . 數據集合
DataBinding中給我們提供了一些現成的集合ObservableArrayList,ObservableArrayMap。這里不做介紹。
Demo_CSDN 下載地址 : http://download.csdn.net/detail/donkor_/9740166
原文鏈接:https://blog.csdn.net/donkor_/article/details/54598215
阿里P7移動互聯網架構師進階視頻(每日更新中)免費學習請點擊:https://space.bilibili.com/474380680