你們好,我是蒼王。
java
如下是我這個系列的相關文章,有興趣能夠參考一下,能夠給個喜歡或者關注個人文章。android
[Android]如何作一個崩潰率少於千分之三噶應用app--章節列表數組
相信有關注個人人,都會看過我第一編介紹的Todo-mvp源碼體驗,這是基礎編。緩存
這個系列的課程適合研發有Android有一年半左右的同窗參考。架構
今天介紹第三編的todo-databinding是Todo-mvp的進階編。app
以前兩編都是基於MVP的架構,而databinding是MVVM的架構,相信不少人都會看過mvvm的基礎吧。mvvm
說一下簡單的配置源碼分析
Android Studio版本在1.3以上
組件化
gradle的版本要在1.5.0-alpha1以上學習
須要在Android SDK manager中下載Android Support repository
而後在對應的Module的build.gradle中添加
而後介紹一些mvvm基礎的源碼
有興趣的同窗,能夠本身深刻查看一下。
固然仍是要從基礎開始提及的啦
咱們以TaskFragment爲例吧,查看一下tasks_frag.xml結構
查看一下它的結構
咱們能夠很容易看到其有兩個變量一個是task,另外一個是actionHandler。
task對應的type是TasksViewModel,其繼承於BaseObservable,能夠在以前說得源碼目錄找到這個代碼,特別注意,若是是@Bindable的註釋對應的是xml中的名稱。
經過調用@{tasks.currentFilteringLabel}的標籤完成雙向的綁定的,其對應的是上面getCurrentFilteringLabel的方法,經過getXXX的方法來獲取相應的值。
而actionHandler對應的TaskContact.Presenter
咱們能夠看到調用onClick的時候會調用到addNewTask的方法,完成操做方法調用的綁定。
若是方法須要傳入參數也是很是簡單的事情,只要再()->XX的()裏面添加參數就能夠了。
這裏很巧妙的將數值和動做分別用一個model類和一個Presenter的類區分開來,有利於下降耦合。
那咱們怎麼知道咱們用的是哪一個TaskViewModel和Presenter的實例呢?
有get的方法,固然咱們須要set的方法來設置實例,咱們會在TasksFragment裏面初始化的時候完成設置。
能夠看到咱們在這裏能夠設置相應的實例對象。
這裏推薦一篇databinding運用入門的文章,裏面詳細介紹了若是運用databinding的文章
Android Data Binding 系列 (一) -- 詳細介紹與使用
若是你點擊TasksFragBinding跳轉會調轉會tasks_frag.xml,你會不會以爲很奇怪?這個類是從哪裏來的?
好了,這裏要簡單解析一下databinding的原理
build的intermediates有兩個databinding編譯生成的文件夾是data-binding-info和data-binding-layout-out
咱們的tasks_frag.xml會轉化爲data-binding-layout-out的layout裏面的tasks_frag.xml
咱們能夠看到這個xml裏面會添加一些tag的標示來替換掉原來的引用mvvm的@{}的代碼
而再進一步編譯會生成data-binding-info的tasks_frag-layout.xml,在這裏會有tasks_frag更詳細的描述。
而TasksFragBinding真正的位置是存在這個路徑下(須要編譯一次才能看到這個文件)
咱們能夠看清它繼承於ViewDataBinding,初始化的時候會經過Binding讀取bindings數組中的View完成綁定
咱們能夠看到調用inflate的方法最後仍是經過bind的方法來初始化
這個todo-databinding裏面沒有經過activity雙向綁定,若是想了解更詳細的話,網上也有不少資料。
三.ListView binding的說明
task_item裏面的原理和上面所說的綁定是同樣的
關鍵在於TaskAdapter中getView裏面綁定的設置。
能夠看到判斷view是否爲null來或者綁定的,建立綁定是經過傳入LayoutInflater來完成初始化。
而DataBinding.getBinding(view)來綁定tag的方式來作緩存。
這個例子只有listView的綁定,若是想參考recylerView的綁定方式,能夠查看一 中提到的連接。
咱們很容易能夠看到咱們的Model是繼承於BaseObservable。咱們能夠經過Observable的方式去通知UI數據已經改變了,固然了,官方爲咱們提供了更加簡便的方式BaseObservable,咱們的實體類只須要繼承該類,稍作幾個操做,就能輕鬆實現數據變化的通知
1.咱們的實體類要繼承BaseObservale類
2.在Getter上使用註解@Bindable
3.在Setter裏調用方法notifyPropertyChanged
BR是編譯階段生成的一個類,功能與 R.java 相似,用@Bindable標記過 getter 方法會在 BR 中生成一個 entry。
當數據發生變化時須要調用notifyPropertyChanged(BR.firstName)通知系統BR.firstName這個 entry 的數據已經發生變化以更新UI。
另外一個經過SwipeRefreshLayout來刷新數據
在SwipeRefreshLayoutDatabinding經過BindingAdapter來指定("android:onRefresh")來傳入參數
方法第一個參數是view,第二參數是TasksContract.Presenter來綁定觸發的實例的事件綁定在一塊兒。讓loadTasks來獲取數據。
具體的源碼分析分析就到這裏了。
若是想進一步瞭解databinding綁定時候的源碼生成能夠查看一下這篇文章
下一節
將會介紹todo-mvp-clean的源碼分析,敬請期待!!!
我創建了一個關於Android架構學習的羣,裏面能夠進一步進行組件化學習和架構思想的的交流。
羣號是316556016,也能夠掃碼進羣。我在這裏期待大家的加入!!!