接上篇,data binding 的接入,在某種意義上,使 xml 布局文件從 V 層(Activity)獨(dú)立出來。V 層不再與 xml 交互 (findViewById,? xxx.setText(), xxx.setEnable) 。而只需關(guān)注與 xml 綁定的 vm 里的數(shù)據(jù)。下圖是接入 data binding 后 MVP 的時(shí)序圖。
data binding 支持在 xml 布局文件里綁定各種事件。比如某點(diǎn)擊事件綁定 Presenter 的方法。如此一來,VM 要持有 Presenter對(duì)象。而且,實(shí)際項(xiàng)目里,點(diǎn)擊事件并不是簡單的觸發(fā)一個(gè)方法。還包括了千奇百怪的業(yè)務(wù)需求。為了保持 VM 的整潔性。事件的綁定還是在 V 層,而不是通過 xml 布局文件。
上圖可看出:
1,vm 僅包含與 xml 布局文件互相綁定的 LiveData 或 BaseObervable,V 層通過更新 vm的數(shù)據(jù)來更新界面。
2,Activity, ViewHolder(個(gè)人理解), View 都?xì)w V層。xml雖然也是,但如上文說的,已相當(dāng)獨(dú)立。
3,控件的各種事件通過 V 層持有的 binding 對(duì)象綁定相關(guān)事件。如上篇文章說的。
4,雙向綁定的實(shí)現(xiàn)是通過? 根據(jù)xml布局文件自動(dòng)生成的 binding類,將ViewModel 賦值到 xml 定義的data屬性里。避免重復(fù)代碼。這里根據(jù)上圖定義 V 層不同類型的基類? Activity -----> BaseVmActivity,View?-----> BaseBindingView。 ViewHolder 比較特殊。綁定操作是在Adapter,后續(xù)單獨(dú)出來聊聊。
BaseVmActivity,?BaseBindingView 思路是一樣的,都是通過反射實(shí)現(xiàn)。在 《MVVM》 里已經(jīng)介紹過。這里就簡單的貼下代碼。
BaseVmActivity:
BaseBindingView :