Android用MVP實現(xiàn)一個簡單的類淘寶訂單頁面的示例
MVP(Model-View-Presenter) 是總所周知MVC模式的一個演變,他們的主要目的都是劃分模塊職責(zé),降低模塊耦合,易測試,提高代碼復(fù)用,網(wǎng)上有很多相關(guān)的知識,這里僅是個人看法。
1、層級
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):降低耦合,層級職責(zé)更明顯,易于單元測試
缺點(diǎn):造成類數(shù)量增多,在某些場景下presenter的復(fù)用會產(chǎn)生接口冗余
這幾天把以前項目上做過的一個類似淘寶訂單的頁面單獨(dú)提取出來重新做了一遍,把一些公共代碼提取出來,方便以后用到類似界面簡易集成,同時也用到了MVP框架,通過MVP之間各層次互相綁定的最基礎(chǔ)的類,將數(shù)據(jù)和邏輯分離開,這是效果圖

值得一提的是,這里用到了一些其他開源代碼,比如刷新樣式swipetoloadlayout等,具體的使用方法大家可以百度搜下名字就行了,資料很多。
4個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對象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é)合寫的,具體代碼參見源碼(本文底部),因為這里只是提供一個淘寶訂單頁面的制作方法,所以這里的所有bean數(shù)據(jù)都暫時用的本地數(shù)據(jù),沒有添加網(wǎng)絡(luò)框架進(jìn)行數(shù)據(jù)加載,有興趣的同學(xué)可以研究下MVP+RxJava+Okhttp+Retrofit,非常好用。
MVP構(gòu)建通過在view層和presenter層中的attachPre()方法進(jìn)行對象綁定:
/**
* 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ù)的 Type 實例化對象。這樣就可以獲取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ī)會再研究下網(wǎng)絡(luò)框架和MVP的集成,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android實現(xiàn)單頁顯示3個Item的ViewPager炫酷切換效果
這篇文章主要為大家詳細(xì)介紹了Android實現(xiàn)單頁顯示3個Item的ViewPager炫酷切換效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-10-10
Android 中圖片和按鈕按下狀態(tài)變化實例代碼解析
這篇文章通過實例代碼給大家總結(jié)了android 中圖片和按鈕按下狀態(tài)變化問題,本文通過實例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧2018-06-06
MVVMLight項目之綁定在表單驗證上的應(yīng)用示例分析
這篇文章主要為大家介紹了MVVMLight項目中綁定在表單驗證上的應(yīng)用示例及源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步除夕快樂,新年快樂2022-01-01
Android Studio連接手機(jī)設(shè)備教程
這篇文章主要為大家詳細(xì)介紹了Android Studio連接手機(jī)設(shè)備教程,非常完整的連接步驟,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-07-07
TextView使用SpannableString設(shè)置復(fù)合文本 SpannableString實現(xiàn)TextView的鏈接
這篇文章主要為大家詳細(xì)介紹了如何利用SpannableString實現(xiàn)TextView的鏈接效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-08-08
Android XMPP通訊自定義Packet&Provider
這篇文章主要介紹了Android XMPP通訊自定義Packet&Provider的相關(guān)資料,需要的朋友可以參考下2016-08-08
RecyclerView+SnapHelper實現(xiàn)無限循環(huán)篩選控件
這篇文章主要為大家詳細(xì)介紹了RecyclerView+SnapHelper實現(xiàn)無限循環(huán)篩選控件,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-10-10

