1. 程式人生 > >玩轉Android之MVVM開發模式實戰,炫酷的DataBinding!

玩轉Android之MVVM開發模式實戰,炫酷的DataBinding!

C# 很早就有了MVVM的開發模式,Android手機中的MVVM一直到去年Google的I\O大會上才推出,姍姍來遲。MVVM這中開發模式的優點自不必多說,可以實現檢視和邏輯程式碼的解耦,而且,按照Google的說法,使用了MVVM的開發模式,還可以提高佈局檔案的解析速度,個人覺得這一點非常重要。我們在安卓開發中經常需要寫很多個findViewById,讓人心煩,很多人不想寫這個於是用了一些註解框架,可是註解框架無論效能多好,效率總是要低於findViewById的,因此,Android中的MVVM也即databinding可以幫助我們徹底解決這個問題。OK,廢話不多說,我們來看看具體要怎麼在Android開發中使用MVVM。

在低版本的AndroidStudio中使用DataBinding稍微有點麻煩,這裡不做介紹。我這裡以AndroidStuido2.1為例來介紹DataBinding。本文主要包含以下幾方面內容:

1.基本使用

2.繫結ImageView

3.繫結ListView

4.點選事件處理

5.資料更新處理

好了,那就開始吧!

1.基本使用

建立好一個Android Project之後,在gradle檔案中新增如下幾行程式碼,表示開啟databinding:

  1. android {  
  2.     ...  
  3.     ...  
  4.     ...  
  5.     dataBinding{  
  6.         enabled true
  7.     }  
  8. }  

就是這麼簡單,一個簡單的databinding配置之後,就可以開始使用資料綁定了。

要使用資料繫結,我們得首先建立一個實體類,比如User實體類,如下:

  1. /** 
  2.  * Created by 王鬆 on 2016/7/31. 
  3.  */
  4. publicclass UserEntity {  
  5.     private String username;  
  6.     private String nickname;  
  7.     privateint age;  
  8.     public UserEntity() {  
  9.     }  
  10.     publicint getAge() {  
  11.         return age;  
  12.     }  
  13.     publicvoid setAge(int age) {  
  14.         this.age = age;  
  15.     }  
  16.     public String getNickname() {  
  17.         return nickname;  
  18.     }  
  19.     publicvoid setNickname(String nickname) {  
  20.         this.nickname = nickname;  
  21.     }  
  22.     public String getUsername() {  
  23.         return username;  
  24.     }  
  25.     publicvoid setUsername(String username) {  
  26.         this.username = username;  
  27.     }  
  28.     public UserEntity(int age, String nickname, String username) {  
  29.         this.age = age;  
  30.         this.nickname = nickname;  
  31.         this.username = username;  
  32.     }  
  33. }  

然後我們來看看佈局檔案該怎麼寫,首先佈局檔案不再是以傳統的某一個容器作為根節點,而是使用<layout></layout>作為根節點,在<layout>節點中我們可以通過<data>節點來引入我們要使用的資料來源,如下:
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <layout  
  3.     xmlns:android="http://schemas.android.com/apk/res/android"
  4.     >  
  5.     <data>  
  6.         <variable  
  7.             name="user"
  8.             type="org.lenve.databinding1.UserEntity"/>  
  9.     </data>  
  10.     <LinearLayout  
  11.         xmlns:tools="http://schemas.android.com/tools"
  12.         android:layout_width="match_parent"
  13.         android:layout_height="match_parent"
  14.         android:orientation="vertical"
  15.         tools:context="org.lenve.databinding1.MainActivity">  
  16.         <TextView  
  17.             android:layout_width="wrap_content"
  18.             android:layout_height="wrap_content"
  19.             android:text="@{user.username}"/>  
  20.         <TextView  
  21.             android:layout_width="wrap_content"
  22.             android:layout_height="wrap_content"
  23.             android:text="@{user.nickname}"/>  
  24.         <TextView  
  25.             android:layout_width="wrap_content"
  26.             android:layout_height="wrap_content"
  27.             android:text="@{String.valueOf(user.age)}"/>  
  28.     </LinearLayout>  
  29. </layout>  

在data中定義的variable節點,name屬性表示變數的名稱,type表示這個變數的型別,例項就是我們實體類的位置,當然,這裡你也可以換一種寫法,如下:
  1. <data>  
  2.     <import type="org.lenve.databinding1.UserEntity"/>  
  3.     <variable  
  4.         name="user"
  5.         type="UserEntity"/>  
  6. </data>  

先使用import節點將UserEntity匯入,然後直接使用即可。但是如果這樣的話又會有另外一個問題,假如我有兩個類都是UserEntity,這兩個UserEntity分屬於不同的包中,又該如何?看下面:
  1. <data>  
  2.     <import type="org.lenve.databinding1.UserEntity" alias="Lenve"/>  
  3.     <variable  
  4.         name="user"
  5.         type="Lenve"/>  
  6. </data>  


在import節點中還有一個屬性叫做alias,這個屬性表示我可以給該類取一個別名,我給UserEntity這個實體類取一個別名叫做Lenve,這樣我就可以在variable節點中直接寫Lenve了。

看完data節點我們再來看看佈局檔案,TextView的text屬性被我直接設定為了@{user.username},這樣,該TextView一會直接將UserEntity實體類的username屬性的值顯示出來,對於顯示age的TextView,我用了String.valueOf來顯示,因為大家知道TextView並不能直接顯示int型資料,所以需要一個簡單的轉換,事實上,我們還可以在{}裡邊進行一些簡單的運算,這些我一會再說。

最後,我們來看看Activity中該怎麼寫,setContentView方法不能夠再像以前那樣來寫了,換成下面的方式:

  1. DataBindingUtil.setContentView(this, R.layout.activity_main)  

該方法有一個返回值,這個返回值就是系統根據我們的activity_main.xml佈局生成的一個ViewModel類,所以完整寫法如下:
  1. ActivityMainBinding activityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);  

有了ViewModel,再把資料繫結上去就可以了,如下:
  1. @Override
  2. protectedvoid onCreate(Bundle savedInstanceState) {  
  3.     super.onCreate(savedInstanceState);  
  4.     ActivityMainBinding activityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);  
  5.     UserEntity user = new UserEntity();  
  6.     user.setAge(34);  
  7.     user.setUsername("zhangsan");  
  8.     user.setNickname("張三");  
  9.     activityMainBinding.setUser(user);  
  10. }  

執行,顯示效果如下:

OK,那我們剛才還說到可以在@{}進行簡單的計算,都有哪些計算呢?我們來看看:

1.基本的三目運算

  1. <TextView  
  2.     android:layout_width="wrap_content"
  3.     android:layout_height="wrap_content"
  4.     android:text="@{user.username??user.nickname}"/>  

兩個??表示如果username屬性為null則顯示nickname屬性,否則顯示username屬性。

2.字元拼接

  1. <TextView  
  2.     android:layout_width="wrap_content"
  3.     android:layout_height="wrap_content"
  4.     android:text="@{`username is :`+user.username}"/>  

大家注意,這裡的字元拼接不是用單引號哦,用的是ESC按鍵下面那個按鍵按出來的。目前DataBinding中的字元拼接還不支援中文。

3.根據資料來決定顯示樣式

  1. <TextView  
  2. 相關推薦

    AndroidMVVM開發模式實戰DataBinding

    C# 很早就有了MVVM的開發模式,Android手機中的MVVM一直到去年Google的I\O大會上才推出,姍姍來遲。MVVM這中開發模式的優點自不必多說,可以實現檢視和邏輯程式碼的解耦,而且,按照Google的說法,使用了MVVM的開發模式,還可以提高佈局檔案的解析速度,

    Android如何處理返回按鈕

    Android和iPhone什麼的手機在按鍵上有一個很大的區別就是Android的手機有返回按鈕。今天就來講一下這個返回按鈕。這個問題處理不好後面會遇到些許的麻煩。 捕獲返回按鈕事件 首先建立一個我們今天要用的APP專案,然後給專案中新增兩個Activi

    Android二維碼生成與識別

    二維碼,我們也稱作QRCode,QR表示quick response即快速響應,在很多App中我們都能見到二維碼的身影,最常見的莫過於微信了。那麼今天我們就來看看怎麼樣在我們自己的App中整合二維碼的掃描與生成功能。OK,廢話不多說,我們就開始做吧。二維碼的使用我主要想分為兩

    AndroidDrawable的使用

    Drawable天天用,可你是否對Drawable家族有一個完整的認知?今天我們就來系統的學習一下Drawable的使用。1.概述用過Drawable的筒子都知道Drawable有很多種,有的時候Drawable是一張圖片,有的時候Drawable是我們通過顏色構造出來的某種

    AndroidPicasso使用詳詳詳詳詳詳解從入門到原始碼剖析

    Picasso是Squareup公司出的一款圖片載入框架,能夠解決我們在Android開發中載入圖片時遇到的諸多問題,比如OOM,圖片錯位等,問題主要集中在載入圖片列表時,因為單張圖片載入誰都會寫。如果我們想在ListView或者GridView或者RecyclerView中

    Android monkeymonkey小實戰

    手機app測試 monkey 自動化測試 小強測試品牌 測試幫日記 環境介紹l 模擬器裏安裝手機百度APPl 本機通過monkey命令進行隨機測試l 所有的命令均在cmd命令模式下輸入執行過程語法:adb shell monkey -p 包名 隨機事件次數,如下圖PS:每個人的環境不一樣,

    Android遊戲開發十七】讓玩家自定義手勢Android遊戲Android Gesture【輸入法手勢技術】

    原創,轉載務必在明顯處註明:轉載自 原文連結: http://www.himigame.com/android-game/340.html很多童鞋說我的程式碼執行後,點選home或者back後會程式異常,如果你也這樣遇到過,那麼你肯定沒有仔細讀完Himi的博文,第十九篇Him

    Android Camera開發(二):使用TextureView和SurfaceTexture預覽Camera 基礎拍照demo

    處理 pict all sans 格式 facet ace ets nth Google自Android4.0出了TextureView。為什麽推出呢?就是為了彌補Surfaceview的不足。另外一方面也是為了平衡GlSurfaceView。當然這是本人揣度的。關於Te

    Android monkeymonkey是啥?monkey=猴子?

    android monkey 手機app測試 小強測試品牌 測試幫日記 自動化測試 引子從本次開始小編將帶你學習Android monkey的用法,我們仍然保持盡可能簡潔明了的告訴大家。也歡迎大家有好文章投稿給我們,有紅包獎勵哦。投稿郵箱:[email protected],備註投稿monk

    Android monkey環境配置和ADB命令

    手機app測試 monkey 小強測試品牌 測試幫日記 轉發是對小編的最大支持接著上篇文章繼續《玩轉Android monkey之monkey是啥?monkey=猴子?》配置SDKl 新建一個系統環境變量:ANDROID_HOMEl 對應的值為你sdk的安裝目錄l 編輯系統環境變量:PATHl

    Android Camera開發 四 預覽介面四周暗中間亮只拍攝矩形區域圖片 附完整原始碼

    分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

    Android MediaPlayer視訊預載入 優化

    分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

    iOS開發藍芽)不看此文枉做開發

    前言: 之前詳細談過不少關於HTTP協議的知識點,TCP/IP也通過tcpdump做過簡單的介紹,但網路協議的本質其實是連線,裝置或者端之間連線的方式有多種,常見的http或者基於tcp的socket只是森林一葉,還有些不那麼常見的協議比如藍芽。適當腦洞,也能玩出不少新花樣

    Android Camera開發 五 基於Google自帶演算法實時檢測人臉並繪製人臉框 網路首發 附完整demo

                        本文主要介紹使用Google自帶的FaceDetectionListener進行人臉檢測,並將檢測到的人臉用矩形框繪製出來。本文程式碼基於PlayCameraV1.0.0,在Camera的open和preview流程上進行了改動。原先是放在單獨執行緒裡,這次我又把它放到

    Android Camera開發(一):Surfaceview預覽Camera,基礎拍照功能完整demo

    雜家前文是在2012年的除夕之夜倉促完成,後來很多人指出了一些問題,瑣事纏身一直沒有進行升級。後來隨著我自己的使用,越來越發現不出個升級版的demo是不行了。有時候就連我自己用這個demo測一些效能、功能點,用著都不順手。當初程式碼是在linux下寫的,弄到windows裡下

    GITgit個人快捷鍵設定和方法【極大提高git-flow開發效率】

    祕訣 我使用的是git bash,環境是windows,一般是沒有.bashrc檔案的用cd ~進入使用者目錄,後在此目錄下建立 .bashrc檔案,命令如下: touch .bashrc 然後 vim .bashrc 然後按下 i 進入編輯模

    android ContentProvider二--實現多個ContentProvider對多張表進行操作

    本人原創作品,謝絕轉載!     其它地方跟一個ContentProvider操作一張表都是一樣的,唯一區別是authority,在宣告的時候要注意,因為要宣告兩個ContentProvider,所以authority也要不一樣,否則就會因為找不到對應的ContentPr

    【機器學習PAI實戰】—— 人工智慧美食推薦

    開發十年,就只剩下這套架構體系了! >>>   

    【機器學習PAI實戰】—— 人工智慧商品價格預測

    開發十年,就只剩下這套架構體系了! >>>   

    Android應用開發基礎

    程序包 兼容 能夠 tick 狀態欄通知 lib 系統應用 java 指定 Android應用開發基礎 英文地址:http://developer.android.com/guide/components/fundamentals.html 本人英語水平不高,如有