高效開發(fā) MVVM 和 databinding 你需要使用的工具_(dá)第1頁
高效開發(fā) MVVM 和 databinding 你需要使用的工具_(dá)第2頁
高效開發(fā) MVVM 和 databinding 你需要使用的工具_(dá)第3頁
高效開發(fā) MVVM 和 databinding 你需要使用的工具_(dá)第4頁
高效開發(fā) MVVM 和 databinding 你需要使用的工具_(dá)第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、閱讀本篇大概需要11分鐘。相信不少同學(xué)已經(jīng)開始使用MVVM作為自己Android開發(fā)架構(gòu)了,但實(shí)際 上,我在使用過程中查閱資料發(fā)現(xiàn),網(wǎng)上有關(guān)MVVM的資料并不是很多,這 主要是因?yàn)镸VVM還是有一定使用門檻的,并且MVVM不一定會幫助你 提高開發(fā)效率,可能你需要寫的代碼更多了,或者說為了你為了讓代碼保持 Databinding的雙向綁定特性,而需要考慮很多業(yè)務(wù)以外的設(shè)計(jì)邏輯。我們使 用一個(gè)架構(gòu)或者設(shè)計(jì)模式,當(dāng)然是為了更好的開發(fā)體驗(yàn)嘛,所以我將給大家介 紹幾個(gè)實(shí)用的第三方庫和工具,來幫助大家解決這些問題。1. MVVMLightFMVVMLightJ這個(gè)第三方庫實(shí)際上是對Databinding工

2、具庫的一些擴(kuò) 展,并且通過ReplyCommand和Responsecommand來對所有的View 的事件進(jìn)行統(tǒng)一封裝,這是我認(rèn)為MVVMLight最大的用處。博客: 源碼: s:/github /kelin-Hong/MVVMLightLinearLayoutandroid:orieotationaverticalM android: layodroid:lyoearLayoutkDesign Text13 24 LF: n Civ master: ( ontext 13 24 LF: n Civ master: ( ontext Switch and =layout xalns:andr

3、oid3LinearLayoutandroid: orientations vertical*android :lyMnatch .parent,android: l”out_Might=、rap_content”android:textsFooActivityM /、Dcsgn Text 1324 IF: Civ mastert Context ioconTrt 6 QAdd u 口八q必:令今:、0app “金4 g ”北:魚寫y|layout | data2 Design TextAdd 口目 切:,:印 口】 7 宗:令 中:、U app “暮|孱孱 :9 y |layout | da

4、ta2 DesignDesignText4. MVVM自動代碼生成MVVM和MVP這種架構(gòu)并不一定會讓我們代碼量減少,每一個(gè)界面可能都 要以一種固定的模式創(chuàng)立很多類,那我們?yōu)槭裁床煌ㄟ^一種自動代碼生成工具 來通過簡單的配置就完成這些類的創(chuàng)立呢,Java完全就可以實(shí)現(xiàn)這些功能。 網(wǎng)上有很多用Java實(shí)現(xiàn)的自動生成代碼的方式,但每個(gè)人實(shí)現(xiàn)的MVP和 MVVM架構(gòu)方式都不同,所以自動化代碼也會不同,我來展示下我這邊使用 的過程吧。我使用的MVVM代碼生成工具的主要思路是比擬簡單粗暴的,通過一個(gè)xml 文件配置一些屬性,比方起一個(gè)名字,設(shè)置一下文件輸出的路徑,然后在Java 里用字符串拼接和文件流讀取

5、的方式來生成模板代碼。7. 1pcrt .public S卬 reotDlr - *,/cenxwProcess Him with e*lt ctfe /nMTU9 Z/iavaXWII*r”文傳言public Strlitf confi9Dlr - r&t01r MtooU/ej public Striftf RodulcMm MesSe“if9。VApllcetli/AMfOU StudU.ap/COAtets/jr/jk/Coft0 coc,Aq fiU, /Vtrt/MapethWMroltfStudirojts/01lQuott/tMlt/aeduU.conflf.Ml rwdinf

6、 config flU. /Hert/wepofhl/Mroi4$ttfditfojtt/OilOuote/tMU/fixed.croMeU、KBM0O4ivTMltolM/WTrad*public cUt* Mala (pubU static String MwiRftocationjprivate static fMl Strsg AJUJttL hli private static final String AMftOOWXH *-n private ttatK finel String AMCJUM fianeMfiQuration aConfjurationj iadCofif i9

7、uration aActlvltyConf 19urti; iU cenfiFiUiAf rootOlr -j public Strinf arcOir -, public Striftf rctOir - *j/snenxM我們來看一下ReplyCommand怎么用。我們用常見的下拉刷新控件PuIIToRefreshLayout 來舉例子。我們知道如果你想自定義一個(gè)控件的事件,你需要使用BindingAdapter注 解,比方ImageView通過URL屬性直接根據(jù)地址下載圖片并顯示可以這樣 寫:B indingAdapter(b i nd:ur1【mage”)public static v

8、oid getlnternetlmage(ImageView iv, String userface) Picasso, wi th(iv. getContext(). load(userface), into(iv);)這種情況往往是比擬簡單的,因?yàn)橹皇遣僮饕粋€(gè)屬性,但我們要自定義某一個(gè) 事件該怎么辦呢,比方我們要自定義onClick事件,那可能就得寫接口了 :B i nd i ngAdapter (set I mageOnC lick)public static void setImageOnC1ick(ImageView imagoVicw, final ImagcOnClickList

9、e ner listener)if (listener != null) imageView. setOnClickListener(v)-(listener. onClick(v);); interface ImageOnClickListener( void onClick(View v);)使用的時(shí)候呢,你得在VM中定義一個(gè)ImageOnClickListener的成員變量 listener,在里面寫具體的onClick實(shí)現(xiàn)方法,然后在xml中通過 app:setImageOnClick=nviewModel.listener來綁定這個(gè)事件。當(dāng)然,你可以直接通過android:onCli

10、ck來進(jìn)行綁定一個(gè)VM方法,這里只是實(shí)例。看起來好像也不是很麻煩,但是你可能每一個(gè)這樣的事件,就得定義一個(gè)特殊 的接口 ,我們能不能封裝一下呢?這就是這兩個(gè)Command做的事了。通過這兩個(gè)類封裝了各種請求參數(shù)數(shù)量 和返回值參數(shù)數(shù)量的回調(diào)方法,在使用的時(shí)候,只要在泛型里具體指名請求參 數(shù)和返回值的類型即可,可以說很方便了。實(shí)例,PullToRefreshLayout是一個(gè)刷新列表控件,我們通過使用 ReplyCommand監(jiān)聽下拉刷新和上拉加載的監(jiān)聽器是這樣寫的:BindView(R. id. refresh listview)PullToRefreshLayout pulIToRefresh

11、Layout;BindingAdapter (value = onRefreshCommand, onLoadConunand, requireAll = fa Ise)public static void onRefreshLoadCommand(final PulIToRefreshLayout pulIToRefreshLayout,final ReplyCommand onRefreshCommand,final ReplyCommand onLoadCommand)pulIToRefreshLayout. setOnRefreshListener(new PulIToRefreshL

12、ayout. OnRefreshL istcner () Overridepublic void onRcfresh(PulIToRefreshLayout pulIToRefreshLayout) if (onRefreshCommand != null) onRefreshCommand. execute 0;) Overridepublic void onLoadMore(Pu11ToRefreshLayout pulIToRefreshLayout) if (onLoadCommand != null)(onLoadCommand. execute(););我們使用統(tǒng)一的ReplyCo

13、mmand來處理控件的各種事件,這里使用的是無 參無返回值的最簡單的情況,我們在ViewModel和xml中的寫法是和之前 的接口差不多的:public final Rep 1yCommand onRefreshCommand = new ReplyCommand() - getPostData (true);public final ReplyCommand onLoadCommand = new ReplyCommand() - getPostData(tr ue);這樣,我們所有事件的接口就統(tǒng)一了。Responsecommand和ReplyCommand的區(qū)別主要在,ResponseCo

14、mmand是用來定義那種有 返回值的參數(shù)的,而ReplyCommand是沒有返回值的,具體的使用方法, 大家可以參考上面的鏈接,作者自己講的最詳細(xì)。binding-collection-adapterrbinding-collection-adapterj 對所有需要 adapter 的控件進(jìn)行了封裝, 比方一些常用的:ListView、RecyclerView. ViewPager等,通過使用這個(gè) 庫,我們就不需要再寫adapter 了 ,通過databinding的方式,在xml綁 定一些屬性,并在ViewModel中對這些屬性進(jìn)行處理即可完成這些控件的處 理,邏輯清晰,代碼簡單。GitH

15、ub : s:/github /evant/binding-collection-adapter下面舉一個(gè)RecyclerView的例子。我們現(xiàn)在xml中定義一個(gè)RecyclerView 控件。我們看到有三個(gè)特殊的屬性:layoutManager、items. itemBinding ,這里 的layoutManager大家都比擬熟悉了,參數(shù)是在開頭的import導(dǎo)入的,傳 入相關(guān)的類名即可。import type=,com. weaponzhi. test. LayoutManagers/)我們先來看一下itemBinding是干什么用的,我們知道有時(shí)候列表項(xiàng)是可能 多布局的,那么這個(gè)ite

16、mBinding就是用來處理每種布局和對應(yīng)item的 ViewModel的綁定關(guān)系的。上述代碼的ViewModel中,定義了該 itemBinding。public final On!temBindClass itemBinding = new OnltemBindClassO.map(NoDataViewMode1. class, BR. noData, R. layout, listitem no data).map(11emViewMode1. class, BR. itemVM, R. layout, listitem page);m叩 方法中有三個(gè)參數(shù),第一個(gè)參數(shù)是這個(gè)布局的View

17、Model ,第三個(gè)參數(shù) 是這個(gè)布局的xml文件,第二個(gè)參數(shù)這個(gè)xml中引入的ViewModel的BR 文件id。這樣我們就綁定好了這個(gè)列表控件的多布局邏輯了。一個(gè)空數(shù)據(jù)時(shí)候 的布局,一個(gè)正常返回?cái)?shù)據(jù)時(shí)候的布局。那么我們的數(shù)據(jù)是如何刷新的呢,這就要用到上面的items這個(gè)屬性了,在我 們這個(gè)例子里,它是這樣定義的:public final ObservableList vicwModcls = new ObservablcArrayListOO ;當(dāng)我們網(wǎng)絡(luò)請求返回的時(shí)候,我們在數(shù)據(jù)回調(diào)里,通過對數(shù)據(jù)類型的處理,進(jìn) 行ItemViewModel的構(gòu)造,最后只需要將構(gòu)造好的對象一個(gè)個(gè)添加到這個(gè)

18、ObservableList數(shù)據(jù)結(jié)構(gòu)中去,界面的刷新工作都在對應(yīng)的ItemViewModel 里中進(jìn)行處理,我們剛剛設(shè)置的itemBinding在這時(shí)候就起作用了 ,當(dāng)新增 數(shù)據(jù)的時(shí)候,它會先判斷這個(gè)更新數(shù)據(jù)的ItemViewModel的數(shù)據(jù)類型, NoDataViewModel.class 類型的,那么就使用 R.layout.listitem_no_data , ItemViewModel.class 類型的,就使用 o 當(dāng)然,其他 的數(shù)據(jù)更新和刪除操作,也會因?yàn)殡p向綁定而同步刷新。我們完全從Adapter的繁瑣中解放出來了 !Databinding support這是一個(gè)Android

19、Studio插件,我們寫xml中的一些Databind代碼比方 (layout,、xvariable,、等標(biāo)簽的使用還是比擬多的,而且寫起來也比擬繁瑣,這個(gè)插件就是可以幫助你解放雙手,只需要在適當(dāng)?shù)?地方按(Windows是Alt+Enter)即可,從官網(wǎng)盜幾張Gif圖給大家 感受一下吧。Wrap with activity_main.xml - MyApplicationlO - /AndroidStudioProjects/MyApplication10遂 ? q口國京4 /、金 app n iik a g | siMyApplicationlO app src 門 main - res

20、layout p activity_main.xml x心 Grad-e 40722itAndroid Mode =-nternao5 Design Text w噌 TODO 9 6: Android Monitor TerminalQ Throwable Assertion faded intention Description Dir URL IsMl Event Log 畫 Cradle Console. (today 8:06) 19:18 IF: Ui 1-8 Context - no conte tt &圖Add tagWrap w-th 0B二ersiwl elKodiflwut

21、-&? Auyoct xnlnsandroid,x droid:o3.2ttionMertisv android : ayoutkdthtmat chlpBrent* android 二youtlheighttmatchlparent J 8uttg,Nron華 id/QOFbuttorr gdzd IwlsdtT.FtchJurw android :iyoutlheightM.wrFcontent,android:textw.*aa 7id:textw,F(xiàn)OOACti5.ty 7,=-QG 百謁O,L?Q2IA7xnl versionzlo= encoding.-utfl8-7v n Acyout xalns - androidu: 、schemas-android .con、apk、res、android; xmlns “ toolsz “ /scheaas android com-tools; xmlns “ app”:hp“ tschenas andyid - con、apk、re

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論