Android用MVP實(shí)現(xiàn)一個(gè)簡單的類淘寶訂單頁面的示例
MVP(Model-View-Presenter) 是總所周知MVC模式的一個(gè)演變,他們的主要目的都是劃分模塊職責(zé),降低模塊耦合,易測試,提高代碼復(fù)用,網(wǎng)上有很多相關(guān)的知識(shí),這里僅是個(gè)人看法。
1、層級(jí)
Model:負(fù)責(zé)數(shù)據(jù)相關(guān)的操作
View:負(fù)責(zé)UI的繪制和用戶的交互
Presenter:作為Model和View的中間協(xié)調(diào)部分,負(fù)責(zé)兩者之間的業(yè)務(wù)邏輯處理
2、MVP的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):降低耦合,層級(jí)職責(zé)更明顯,易于單元測試
缺點(diǎn):造成類數(shù)量增多,在某些場景下presenter的復(fù)用會(huì)產(chǎn)生接口冗余
這幾天把以前項(xiàng)目上做過的一個(gè)類似淘寶訂單的頁面單獨(dú)提取出來重新做了一遍,把一些公共代碼提取出來,方便以后用到類似界面簡易集成,同時(shí)也用到了MVP框架,通過MVP之間各層次互相綁定的最基礎(chǔ)的類,將數(shù)據(jù)和邏輯分離開,這是效果圖
值得一提的是,這里用到了一些其他開源代碼,比如刷新樣式swipetoloadlayout等,具體的使用方法大家可以百度搜下名字就行了,資料很多。
4個(gè)Fragment用的統(tǒng)一的靜態(tài)構(gòu)建方法,配合ViewPager和TabLayout進(jìn)行一次性集成
//統(tǒng)一的Fragment構(gòu)建方法 public static MerchandiseListBaseFragment newInstance(int flag) { Bundle args = new Bundle(); //type代表頁簽,0:全部訂單 1:待發(fā)貨 2:待收貨 3:已完成 args.putString("type", String.valueOf(flag)); MerchandiseListBaseFragment fragment = new MerchandiseListBaseFragment(); fragment.setArguments(args); return fragment; }
/** * 初始化ViewPager */ private void initViewPager() { final ArrayList<Fragment> fragmentList = new ArrayList<>(); MerchandiseListBaseFragment merchandiseListAll = MerchandiseListBaseFragment. newInstance(0); MerchandiseListBaseFragment merchandiseListDisPatch = MerchandiseListBaseFragment. newInstance(1); MerchandiseListBaseFragment merchandiseListReceive = MerchandiseListBaseFragment. newInstance(2); MerchandiseListBaseFragment merchandiseListFinish = MerchandiseListBaseFragment. newInstance(3); MerchandiseListBaseFragment.firstGetData();//初始化數(shù)據(jù) //持有fragment對(duì)象List fragmentList.add(merchandiseListAll); fragmentList.add(merchandiseListDisPatch); fragmentList.add(merchandiseListReceive); fragmentList.add(merchandiseListFinish); FragmentPagerAdapter fragmentAdapter = new BaseFragmentAdapter(getSupportFragmentManager(), fragmentList, mTitles); viewPager.setAdapter(fragmentAdapter); viewPager.setCurrentItem(0); viewPager.setOffscreenPageLimit(4); viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { tabLayout.getTabAt(position).select(); } @Override public void onPageScrollStateChanged(int state) { } }); tabLayout.setupWithViewPager(viewPager);//將tabLayout和ViewPager綁定 tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(TabLayout.Tab tab) { viewPager.setCurrentItem(tab.getPosition()); } @Override public void onTabUnselected(TabLayout.Tab tab) { } @Override public void onTabReselected(TabLayout.Tab tab) { } }); }
訂單列表是通過RecyclerView和swipetoloadlayout結(jié)合寫的,具體代碼參見源碼(本文底部),因?yàn)檫@里只是提供一個(gè)淘寶訂單頁面的制作方法,所以這里的所有bean數(shù)據(jù)都暫時(shí)用的本地?cái)?shù)據(jù),沒有添加網(wǎng)絡(luò)框架進(jìn)行數(shù)據(jù)加載,有興趣的同學(xué)可以研究下MVP+RxJava+Okhttp+Retrofit,非常好用。
MVP構(gòu)建通過在view層和presenter層中的attachPre()方法進(jìn)行對(duì)象綁定:
/** * MVP綁定 */ @Override public void attachPre() { activity = this; // mContext = this; mPresenter = TUtil.getT(this, ID_PRESENTER); mModel = TUtil.getT(this, ID_MODEL); if (mPresenter != null) { mPresenter.mContext = this; } initPresenter(); }
這里的getT方法是用來得到類的模板參數(shù)的類型的,返回表示此類型實(shí)際類型參數(shù)的 Type 實(shí)例化對(duì)象。這樣就可以獲取view
public static <T> T getT(Object o, int i) { try { return ((Class<T>) ((ParameterizedType) (o.getClass() .getGenericSuperclass())).getActualTypeArguments()[i]) .newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassCastException e) { e.printStackTrace(); } return null; }
源碼地址:https://github.com/WeaponZhi/MerchandiseList
以后有機(jī)會(huì)再研究下網(wǎng)絡(luò)框架和MVP的集成,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
詳解Android Studio實(shí)現(xiàn)用戶登陸界面demo(xml實(shí)現(xiàn))
這篇文章主要介紹了詳解Android Studio實(shí)現(xiàn)用戶登陸界面demo,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05android實(shí)現(xiàn)來電靜音示例(監(jiān)聽來電)
這篇文章主要介紹了手機(jī)來電鈴聲響起后,通過此代碼實(shí)現(xiàn)靜音而非掛斷的方法的相關(guān)資料2014-03-03Android自定義processor實(shí)現(xiàn)bindView功能的實(shí)例
下面小編就為大家分享一篇Android自定義processor實(shí)現(xiàn)bindView功能的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2017-12-12基于Android實(shí)現(xiàn)百度地圖定位過程詳解
這篇文章主要介紹了基于Android實(shí)現(xiàn)百度地圖定位過程詳解,需要的朋友可以參考下2015-11-11Android界面設(shè)計(jì)(APP設(shè)計(jì)趨勢 左側(cè)隱藏菜單右邊顯示content)
這文章講述了2013年未來的移動(dòng)APP設(shè)計(jì)趨勢,感覺挺有道理的:Android界面設(shè)計(jì)實(shí)現(xiàn)左側(cè)隱藏菜單右邊顯示content,感興趣的你可以了解下啊,希望本文對(duì)你的APP設(shè)計(jì)提高有所幫助哦2013-01-01Android 使用 Scroller 實(shí)現(xiàn)平滑滾動(dòng)功能的示例代碼
這篇文章主要介紹了Android 使用 Scroller 實(shí)現(xiàn)平滑滾動(dòng)功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07