目前這個項目已經開源到GitHub上面,歡迎你們關注
github.com/lemon-yang/…java
android data binding library爲咱們提供了一個頁面與數據綁定的技術,尤爲是android gradle plugin在2.2的版本以後,更是開始支持了雙向綁定以及lambada表達式,使得data binding的技術更加成熟,而將data bingding技術結合的mvvm設計結構也愈來愈獲得更多的關注。在前面個人文章裏面,已經從源碼的角度,講述了data binding庫的一些實現細節。如今結合data binding的技術實現一個adapter庫。android
聲明:這個庫是在看了GitHub上面的一個開源項目binding-collection-adapter,而後結合本身的理解以及一些實際的經驗進行了優化和代碼總體結構的調整。對於源碼中優秀的工具類,我都沒有修改,按照原來的進行保留,並在文件頭標明瞭文件的出處。git
目前已經完成的功能:github
目前還不完善的功能;架構
上面的類圖基本上描述了代碼中的結構,用兩個表達式闡述整個庫的功能實現就是:mvvm
adapter = ViewManager + ViewModle + Factory
ViewModle = Decorator + model(data)工具
ViewManager的設計初衷其實就是爲了管理adapter須要裝載的各類item的樣式。每一個adapter在初始化的時候都必須構建一個ViewManager的實例,這個ViewManager的實例標識了這個adapter須要加載的item的所有類型。佈局
在庫當中,我將每一個item抽象成了一個ItemView的對象, 主要包含了兩個屬性,一個是對應的佈局文件ID,一個是item所綁定的data的索引值,也就是data binding中BR.java當中的值。而ViewManager則封裝了對ItemView的操做邏輯,使得item視圖選擇對外部是透明的。post
ViewManager當中核心的邏輯就只有兩個部分:gradle
另外ViewManager當中還包含了一個 NO_VARIABLE_BINDING 的常量值,當item不須要進行數據綁定的時候,可使用這個標誌位進行標識。
當咱們使用data binding技術以後,data binding庫會自動的爲咱們初始化視圖,而且將數據與視圖進行綁定。可是不少時候,當咱們使用的是一些複雜的item視圖類型的時候,咱們須要對item裏面的視圖進行不少的配置操做。好比說咱們在item當中加載的是一個圖標的時候,咱們須要對圖標進行不少的屬性配置。這種狀況下,若是純粹的依賴data binding的話,可能須要咱們經過註解@BindAdapter完成相應的設置。若是不習慣這種作法的話,咱們這個時候就可使用decorator對象了。
Decorator是一個接口,包含兩個接口方法:
這個方法會在視圖被data binding庫加載以後回調
這個方法會在視圖與數據綁定以後被回調。
目前的實現中,ViewModle能夠經過依賴注入增長這個接口的實現,而ViewModle對象是咱們list裝載的item數據內容。也就是說每一個item其實都具有一個Decorator的實現。當咱們須要對item的視圖進行更多的配置的時候,就能夠實現這個接口,並注入到咱們的ViewModle裏面。
咱們庫當中的list裝載的內容要求都是ViewModel的子類。也就是說咱們須要將實際應用的model再進行封裝一層。
在庫當中的實現,我仍是經過依賴注入將model(data)數據注入到ViewModel當中,並且咱們能夠往ViewModel注入更多的數據,也能夠將一些交互的事件的實如今ViewModel當中。
庫當中的全部的adapter都實現了對應的工廠接口方法,咱們能夠經過實現工廠方法返回咱們須要的自定義的adapter類型。默認都會提供一個DEFAULT的工廠,返回對應的adpter的基類。
這個類是庫當中處理data binding相關注解的實現中樞。庫提供了經過在XML當中配置屬性,完成adpter的構建以及數據綁定的操做。若是你很熟悉data binding的使用方法的話,你能夠經過添加對應的XML屬性設置就能夠完成adapter的綁定了,很是的簡單快捷。若是你不熟悉這樣的方式,也可使用傳統的在java代碼中進行實例化和設置操做。
目前這個庫的設計還比較初期,功能也只是完成了幾本覆蓋,而且由於是基於data binding技術設計的,所以項目當中必須在gradle當中打開data binding的開關才能夠。接下來會針對實際應用中的需求不斷完善這個庫的功能。
另外data binding在項目中只是負責了數據與視圖綁定的操做,對於庫當中其餘的核心功能以及整個庫的架構是沒有強耦合的,所以咱們徹底能夠經過開放數據綁定的邏輯接口方法,就可以實現一個不依賴data binding的adapter庫。
目前這個項目我已經開源到GitHub上面,有興趣的同窗能夠star一下,也能夠歡迎fork這個倉庫,一塊兒改進。DataBindingAdapter.
若是你喜歡這篇文章,歡迎收藏。也歡迎你關注我,一塊兒討論更多的問題,感謝你寶貴的時間閱讀這篇文章,謝謝!