




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、閱讀本篇大概需要11分鐘。相信不少同學(xué)已經(jīng)開始使用MVVM作為自己Android開發(fā)架構(gòu)了,但實(shí)際 上,我在使用過程中查閱資料發(fā)現(xiàn),網(wǎng)上有關(guān)MVVM的資料并不是很多,這 主要是因?yàn)镸VVM還是有一定使用門檻的,并且MVVM不一定會(huì)幫助你 提高開發(fā)效率,可能你需要寫的代碼更多了,或者說為了你為了讓代碼保持 Databinding的雙向綁定特性,而需要考慮很多業(yè)務(wù)以外的設(shè)計(jì)邏輯。我們使 用一個(gè)架構(gòu)或者設(shè)計(jì)模式,當(dāng)然是為了更好的開發(fā)體驗(yàn)嘛,所以我將給大家介 紹幾個(gè)實(shí)用的第三方庫(kù)和工具,來幫助大家解決這些問題。1. MVVMLightFMVVMLightJ這個(gè)第三方庫(kù)實(shí)際上是對(duì)Databinding工
2、具庫(kù)的一些擴(kuò) 展,并且通過ReplyCommand和Responsecommand來對(duì)所有的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自動(dòng)代碼生成MVVM和MVP這種架構(gòu)并不一定會(huì)讓我們代碼量減少,每一個(gè)界面可能都 要以一種固定的模式創(chuàng)立很多類,那我們?yōu)槭裁床煌ㄟ^一種自動(dòng)代碼生成工具 來通過簡(jiǎn)單的配置就完成這些類的創(chuàng)立呢,Java完全就可以實(shí)現(xiàn)這些功能。 網(wǎng)上有很多用Java實(shí)現(xiàn)的自動(dòng)生成代碼的方式,但每個(gè)人實(shí)現(xiàn)的MVP和 MVVM架構(gòu)方式都不同,所以自動(dòng)化代碼也會(huì)不同,我來展示下我這邊使用 的過程吧。我使用的MVVM代碼生成工具的主要思路是比擬簡(jiǎn)單粗暴的,通過一個(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);)這種情況往往是比擬簡(jiǎn)單的,因?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è)類封裝了各種請(qǐng)求參數(shù)數(shù)量 和返回值參數(shù)數(shù)量的回調(diào)方法,在使用的時(shí)候,只要在泛型里具體指名請(qǐng)求參 數(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來處理控件的各種事件,這里使用的是無 參無返回值的最簡(jiǎn)單的情況,我們?cè)赩iewModel和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 對(duì)所有需要 adapter 的控件進(jìn)行了封裝, 比方一些常用的:ListView、RecyclerView. ViewPager等,通過使用這個(gè) 庫(kù),我們就不需要再寫adapter 了 ,通過databinding的方式,在xml綁 定一些屬性,并在ViewModel中對(duì)這些屬性進(jìn)行處理即可完成這些控件的處 理,邏輯清晰,代碼簡(jiǎ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就是用來處理每種布局和對(duì)應(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ò)請(qǐng)求返回的時(shí)候,我們?cè)跀?shù)據(jù)回調(diào)里,通過對(duì)數(shù)據(jù)類型的處理,進(jìn) 行ItemViewModel的構(gòu)造,最后只需要將構(gòu)造好的對(duì)象一個(gè)個(gè)添加到這個(gè)
18、ObservableList數(shù)據(jù)結(jié)構(gòu)中去,界面的刷新工作都在對(duì)應(yīng)的ItemViewModel 里中進(jìn)行處理,我們剛剛設(shè)置的itemBinding在這時(shí)候就起作用了 ,當(dāng)新增 數(shù)據(jù)的時(shí)候,它會(huì)先判斷這個(gè)更新數(shù)據(jù)的ItemViewModel的數(shù)據(jù)類型, NoDataViewModel.class 類型的,那么就使用 R.layout.listitem_no_data , ItemViewModel.class 類型的,就使用 o 當(dāng)然,其他 的數(shù)據(jù)更新和刪除操作,也會(huì)因?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口國(guó)京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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 照明燈具的鄉(xiāng)村照明改善考核試卷
- 游樂設(shè)備國(guó)際市場(chǎng)趨勢(shì)分析考核試卷
- 機(jī)床制造業(yè)商業(yè)模式創(chuàng)新與盈利模式考核試卷
- 企業(yè)設(shè)備更新與技改項(xiàng)目管理考核試卷
- 寶石鑒定的實(shí)驗(yàn)室設(shè)備與操作規(guī)范考核試卷
- 快速消費(fèi)品包裝策略考核試卷
- 上海學(xué)校團(tuán)膳服務(wù)合同標(biāo)準(zhǔn)文本
- 借款合同范例廣告
- 專業(yè)分包項(xiàng)目合同范例
- 殘疾人職業(yè)規(guī)劃與生涯發(fā)展考核試卷
- 產(chǎn)業(yè)研究報(bào)告-2025年中國(guó)印染行業(yè)發(fā)展現(xiàn)狀、市場(chǎng)規(guī)模、投資前景分析(智研咨詢)
- 財(cái)務(wù)崗位招聘筆試題與參考答案(某大型國(guó)企)2025年
- 全微分教學(xué)課件
- 2025風(fēng)電機(jī)組無人機(jī)巡檢技術(shù)方案
- 2024年西安航空職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫(kù)標(biāo)準(zhǔn)卷
- 四川2025年西南科技大學(xué)事業(yè)編制博士輔導(dǎo)員招聘10人筆試歷年典型考點(diǎn)(頻考版試卷)附帶答案詳解
- 2024-2025學(xué)年廣東省深圳市南山區(qū)監(jiān)測(cè)數(shù)學(xué)三年級(jí)第一學(xué)期期末學(xué)業(yè)水平測(cè)試試題含解析
- GB/T 44869-2024玩具及兒童用品綠色包裝技術(shù)規(guī)范
- 2025年中國(guó)政法大學(xué)招考聘用管理單位筆試遴選500模擬題附帶答案詳解
- 2025屆高考地理 二輪復(fù)習(xí)課件-專題39 產(chǎn)業(yè)結(jié)構(gòu)變化和產(chǎn)業(yè)轉(zhuǎn)移
- 裝配式建筑深化設(shè)計(jì)-1.1.1 裝配式建筑深化設(shè)計(jì)概65課件講解
評(píng)論
0/150
提交評(píng)論