1. MVP簡介
M就是model,里邊放的是javabean蛾绎;
V就是View昆箕,就是Activity、Fragment租冠;
P就是Presenter鹏倘;
2. 自己使用
全局需要定義:
定義BaseView、BasePresenter肺稀,BaseView是View的父類第股,BasePresenter是Presenter的父類;
舉例:這里以請求HomeFragment的 BannerView輪播圖數(shù)據(jù)為例话原,結(jié)構(gòu)如下:
由上圖可以看出
1>:整個項目底部來回切換的多個fragment都是放在ui包下邊的;
2>:自己手動新建一個contract包诲锹,定義HomeFragmentContract接口繁仁,在里邊定義View繼承BaseView,里邊的方法用于給Activity或者Fragment回調(diào)归园;定義Presenter繼承BasePresenter黄虱,里邊的方法用于寫具體的聯(lián)網(wǎng)請求的邏輯代碼,目的就是把具體聯(lián)網(wǎng)請求的方法和給Activity庸诱、Fragment中提供的方法分開捻浦,達(dá)到最大程度解耦晤揣;
下邊以home首頁的fragment為例,定義4個包朱灿,分別是contract昧识、model、view盗扒、presenter跪楞;
3. 具體分析
3.1:定義HomeFragmentContract接口,代碼如下:
/**
* Email: 2185134304@qq.com
* Created by JackChen 2018/4/8 17:34
* Version 1.0
* Params:
* Description: :Home主頁面
*/
public interface HomeFragmentContract {
//View(activity/fragment)繼承侣灶,需要實現(xiàn)的方法
interface View extends BaseView {
//設(shè)置輪播圖
void setBanner(BannerView mBanner, List<Object> arrayList);
void setOnclick(int position);
void setMarqueeClick(int position);
void setGridClick(int position);
void setGridClickThird(int position);
void setGridClickFour(int position);
void setNewsList2Click(int position, String url);
void setNewsList5Click(int position , String url);
}
//Presenter控制器
interface Presenter extends BasePresenter {
void setActivity(MainActivity activity);
//初始化
DelegateAdapter initRecyclerView(RecyclerView recyclerView);
BaseDelegateAdapter initBannerAdapter();
BaseDelegateAdapter initGvMenu();
BaseDelegateAdapter initMarqueeView();
BaseDelegateAdapter initTitle(String title);
BaseDelegateAdapter initList1();
BaseDelegateAdapter initList2();
}
}
contract中需要做的事:
1>:寫一個 View接口用于繼承BaseView甸祭,View就指的是Activity、Fragment褥影,里邊寫的方法就是Activity或者Fragment中所需要實現(xiàn)的方法名字池户;
2>:寫一個 Presenter接口繼承BasePresenter控制器,里邊的方法就是具體的聯(lián)網(wǎng)請求的方法凡怎;
3.2:自己定義一個 HomeFragmentPresenter校焦,只實現(xiàn) HomeFrgmentContract.Presenter,然后復(fù)寫所有的方法栅贴,而不實現(xiàn)HomeFragmentContract.View斟湃,目的是讓Activity或者Fragment實現(xiàn),這里就是讓HomeFragment實現(xiàn)HomeFragmentContract.View檐薯,然后實現(xiàn)具體方法:
1>:HomeFrgmentContract中的View下邊的方法凝赛,是讓Activity、Fragment中回調(diào)的方法坛缕;
2>:HomeFragmentContract中的 Presenter下邊的方法墓猎,是在HomeFragmentPresenter中實現(xiàn)的方法,然后把具體的聯(lián)網(wǎng)請求的數(shù)據(jù)都寫到Presenter下邊的方法赚楚,只需要返回數(shù)據(jù)的結(jié)果給Activity或者Fragment就可以毙沾;
具體代碼如下:
/**
* Email: 2185134304@qq.com
* Created by JackChen 2018/4/8 17:37
* Version 1.0
* Params:
* Description: HomeFragmentPresenter
*/
public class HomeFragmentPresenter implements HomeFragmentContract.Presenter {
private HomeFragmentContract.View mView;
private CompositeSubscription mSubscriptions;
private MainActivity activity;
public HomeFragmentPresenter(HomeFragmentContract.View androidView) {
this.mView = androidView;
mSubscriptions = new CompositeSubscription();
}
@Override
public void subscribe() {
}
@Override
public void unSubscribe() {
mSubscriptions.clear();
}
@Override
public void setActivity(MainActivity activity) {
this.activity = activity;
}
@Override
public DelegateAdapter initRecyclerView(RecyclerView recyclerView) {
//初始化
//創(chuàng)建VirtualLayoutManager對象
VirtualLayoutManager layoutManager = new VirtualLayoutManager(activity);
recyclerView.setLayoutManager(layoutManager);
//設(shè)置回收復(fù)用池大小,(如果一屏內(nèi)相同類型的 View 個數(shù)比較多宠页,需要設(shè)置一個合適的大小左胞,防止來回滾動時重新創(chuàng)建 View)
RecyclerView.RecycledViewPool viewPool = new RecyclerView.RecycledViewPool();
recyclerView.setRecycledViewPool(viewPool);
viewPool.setMaxRecycledViews(0, 20);
//設(shè)置適配器
DelegateAdapter delegateAdapter = new DelegateAdapter(layoutManager, true);
recyclerView.setAdapter(delegateAdapter);
return delegateAdapter;
}
/**
* 設(shè)置輪播圖數(shù)據(jù)
* @return
*/
@Override
public BaseDelegateAdapter initBannerAdapter() {
final List<Object> arrayList = new ArrayList<>();
arrayList.add("http://bpic.wotucdn.com/11/66/23/55bOOOPIC3c_1024.jpg!/fw/780/quality/90/unsharp/true/compress/true/watermark/url/L2xvZ28ud2F0ZXIudjIucG5n/repeat/true");
arrayList.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1505470629546&di=194a9a92bfcb7754c5e4d19ff1515355&imgtype=0&src=http%3A%2F%2Fpics.jiancai.com%2Fimgextra%2Fimg01%2F656928666%2Fi1%2FT2_IffXdxaXXXXXXXX_%2521%2521656928666.jpg");
//banner
return new BaseDelegateAdapter(activity, new LinearLayoutHelper(), R.layout.view_vlayout_banner, 1, Constant.viewType.typeBanner) {
@Override
public void onBindViewHolder(BaseViewHolder holder, int position) {
super.onBindViewHolder(holder, position);
// 綁定數(shù)據(jù)
BannerView mBanner = holder.getView(R.id.banner);
mView.setBanner(mBanner,arrayList);
}
};
}
/**
* 設(shè)置8宮格數(shù)據(jù)
*/
@Override
public BaseDelegateAdapter initGvMenu() {
//menu
// 在構(gòu)造函數(shù)設(shè)置每行的網(wǎng)格個數(shù)
final TypedArray proPic = activity.getResources().obtainTypedArray(R.array.find_gv_image);
final String[] proName = activity.getResources().getStringArray(R.array.find_gv_title);
final List<Integer> images = new ArrayList<>();
for(int a=0 ; a<proName.length ; a++){
images.add(proPic.getResourceId(a,R.mipmap.ic_data_picture));
}
proPic.recycle();
GridLayoutHelper gridLayoutHelper = new GridLayoutHelper(4);
gridLayoutHelper.setPadding(0, 16, 0, 16);
gridLayoutHelper.setVGap(16); // 控制子元素之間的垂直間距
gridLayoutHelper.setHGap(0); // 控制子元素之間的水平間距
gridLayoutHelper.setBgColor(Color.WHITE);
return new BaseDelegateAdapter(activity, gridLayoutHelper, R.layout.item_vp_grid_iv, 8, Constant.viewType.typeGv) {
@Override
public void onBindViewHolder(BaseViewHolder holder, @SuppressLint("RecyclerView") final int position) {
super.onBindViewHolder(holder, position);
holder.setText(R.id.tv_new_seed_title, proName[position]);
holder.setImageResource(R.id.iv_new_seed_ic, images.get(position));
holder.getView(R.id.ll_new_seed_item).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mView.setOnclick(position);
}
});
}
};
}
/**
* 設(shè)置精選垂直滾動的數(shù)據(jù)
*/
@Override
public BaseDelegateAdapter initMarqueeView() {
LinearLayoutHelper linearLayoutHelper = new LinearLayoutHelper();
return new BaseDelegateAdapter(activity,linearLayoutHelper , R.layout.view_vlayout_marquee, 1, Constant.viewType.typeMarquee) {
@Override
public void onBindViewHolder(BaseViewHolder holder, int position) {
super.onBindViewHolder(holder, position);
MarqueeView marqueeView = holder.getView(R.id.marqueeView);
List<String> info1 = new ArrayList<>();
info1.add("1.銀卡惠,一款大家都在使用的產(chǎn)品举户,出售各種優(yōu)惠劵烤宙!");
info1.add("2.歡迎入住銀卡惠app,讓您財運亨通俭嘁!");
marqueeView.startWithList(info1);
// 在代碼里設(shè)置自己的動畫
marqueeView.setOnItemClickListener(new MarqueeView.OnItemClickListener() {
@Override
public void onItemClick(int position, TextView textView) {
mView.setMarqueeClick(position);
}
});
}
};
}
@Override
public BaseDelegateAdapter initTitle(final String title) {
return new BaseDelegateAdapter(activity, new LinearLayoutHelper(), R.layout.view_vlayout_title, 1, Constant.viewType.typeTitle) {
@Override
public void onBindViewHolder(BaseViewHolder holder, int position) {
super.onBindViewHolder(holder, position);
holder.setText(R.id.tv_title, title);
}
};
}
@Override
public BaseDelegateAdapter initList1() {
// //item1 gird
// final TypedArray list1_image = activity.getResources().obtainTypedArray(R.array.find_list1_image);
// final String[] list1_title = activity.getResources().getStringArray(R.array.find_list1_title);
// final List<Integer> images = new ArrayList<>();
// for(int a=0 ; a<list1_title.length ; a++){
// images.add(list1_image.getResourceId(a,R.mipmap.ic_data_picture));
// }
// list1_image.recycle();
// GridLayoutHelper gridLayoutHelper = new GridLayoutHelper(4);
// gridLayoutHelper.setMargin(0, 0, 0, 0);
// gridLayoutHelper.setPadding(0, 20, 0, 10);
// gridLayoutHelper.setVGap(10);// 控制子元素之間的垂直間距
// gridLayoutHelper.setHGap(0);// 控制子元素之間的水平間距
// gridLayoutHelper.setWeights(new float[]{25, 25, 25 , 25});
// gridLayoutHelper.setBgColor(Color.WHITE);
// //gridLayoutHelper.setAutoExpand(true);//是否自動填充空白區(qū)域
// return new BaseDelegateAdapter(activity, gridLayoutHelper, R.layout.view_vlayout_grid, 8, Constant.viewType.typeGvSecond) {
// @Override
// public void onBindViewHolder(BaseViewHolder holder, @SuppressLint("RecyclerView") final int position) {
// super.onBindViewHolder(holder, position);
// holder.setText(R.id.tv_title, list1_title[position]);
// ImageView iv = holder.getView(R.id.iv_image);
// ImageUtils.loadImgByPicasso(activity, images.get(position), iv);
// holder.getItemView().setOnClickListener(new View.OnClickListener() {
// @Override
// public void onClick(View v) {
// mView.setGridClick(position);
// }
// });
// }
// };
return null ;
}
@Override
public BaseDelegateAdapter initList2() {
LinearLayoutHelper linearLayoutHelper = new LinearLayoutHelper();
linearLayoutHelper.setAspectRatio(4.0f);
linearLayoutHelper.setDividerHeight(5);
linearLayoutHelper.setMargin(0, 0, 0, 0);
linearLayoutHelper.setPadding(0, 0, 0, 10);
//linearLayoutHelper.setBgColor(0xFFF5A623);
return new BaseDelegateAdapter(activity, linearLayoutHelper, R.layout.item_tx_news_list, 3, Constant.viewType.typeNews) {
@Override
public void onBindViewHolder(BaseViewHolder holder, final int position) {
super.onBindViewHolder(holder, position);
if (Constant.findNews != null && Constant.findNews.size() > 0) {
HomeBlogEntity model = Constant.findNews.get(position);
holder.setText(R.id.tv_title, model.getTitle());
ImageView imageView = holder.getView(R.id.iv_logo);
ImageUtils.loadImgByPicassoError(activity, model.getImageUrl(), R.mipmap.image_default, imageView);
holder.setText(R.id.tv_time, model.getTime());
holder.getItemView().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mView.setNewsList2Click(position,Constant.findNews.get(position).getUrl());
}
});
} else {
ImageView imageView = holder.getView(R.id.iv_logo);
holder.setText(R.id.tv_title, "標(biāo)題 ");
imageView.setImageResource(R.mipmap.image_default);
holder.setText(R.id.tv_time, "時間");
}
}
};
}
/**
* 豆瓣電影
*/
@Override
public BaseDelegateAdapter initList3() {
final TypedArray list3_image = activity.getResources().obtainTypedArray(R.array.find_list3_image);
final String[] list3_title = activity.getResources().getStringArray(R.array.find_list3_title);
final String[] list3_title_price = activity.getResources().getStringArray(R.array.find_list3_title_price);
final List<Integer> images = new ArrayList<>();
for(int a=0 ; a<list3_title.length ; a++){
images.add(list3_image.getResourceId(a,R.mipmap.ic_data_picture));
}
list3_image.recycle();
GridLayoutHelper gridLayoutHelper = new GridLayoutHelper(3);
gridLayoutHelper.setMargin(20, 0, 20, 0);
gridLayoutHelper.setPadding(0, 20, 0, 10);
gridLayoutHelper.setBgColor(Color.WHITE);
//gridLayoutHelper.setAspectRatio(1.5f); // 設(shè)置設(shè)置布局內(nèi)每行布局的寬與高的比
// gridLayoutHelper特有屬性(下面會詳細(xì)說明)
//設(shè)置每行中 每個網(wǎng)格寬度 占 每行總寬度 的比例
gridLayoutHelper.setWeights(new float[]{30, 40, 30});
gridLayoutHelper.setVGap(0);// 控制子元素之間的垂直間距
gridLayoutHelper.setHGap(5);// 控制子元素之間的水平間距
//gridLayoutHelper.setAutoExpand(false);//是否自動填充空白區(qū)域
//gridLayoutHelper.setSpanCount(6); // 設(shè)置每行多少個網(wǎng)格
return new BaseDelegateAdapter(activity, gridLayoutHelper, R.layout.view_vlayout_hor, 3, Constant.viewType.typeList) {
@Override
public void onBindViewHolder(BaseViewHolder holder, @SuppressLint("RecyclerView") final int position) {
super.onBindViewHolder(holder, position);
holder.setText(R.id.tv_title, list3_title[position]);
holder.setText(R.id.tv_price , list3_title_price[position]) ;
ImageView iv = holder.getView(R.id.iv_image);
ImageUtils.loadImgByPicasso(activity, images.get(position), iv);
holder.getItemView().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 豆瓣的3個圖片的點擊事件
mView.setGridClickThird(position);
}
});
}
};
// return null ;
}
/**
* 為您精選
*/
@Override
public BaseDelegateAdapter initList4() {
final TypedArray list4_image = activity.getResources().obtainTypedArray(R.array.find_list4_image);
final String[] list4_title = activity.getResources().getStringArray(R.array.find_list4_title);
final String[] list4_title_price = activity.getResources().getStringArray(R.array.find_list4_title_price);
final List<Integer> images = new ArrayList<>();
for(int a=0 ; a<list4_title.length ; a++){
images.add(list4_image.getResourceId(a,R.mipmap.ic_data_picture));
}
list4_image.recycle();
OnePlusNLayoutHelper onePlusNLayoutHelper = new OnePlusNLayoutHelper();
//noinspection deprecation
onePlusNLayoutHelper.setBgColor(activity.getResources().getColor(R.color.colorWhite));
//onePlusNLayoutHelper.setAspectRatio(2.0f);
//onePlusNLayoutHelper.setColWeights(new float[]{40f});
//onePlusNLayoutHelper.setRowWeight(30f);
onePlusNLayoutHelper.setMargin(0, 0, 0, 0);
onePlusNLayoutHelper.setPadding(10, 20, 10, 10);
return new BaseDelegateAdapter(activity, onePlusNLayoutHelper, R.layout.view_vlayout_plus, 3, Constant.viewType.typePlus) {
@Override
public void onBindViewHolder(BaseViewHolder holder, @SuppressLint("RecyclerView") final int position) {
super.onBindViewHolder(holder, position);
if (position == 0) {
holder.getView(R.id.ll_first).setVisibility(View.VISIBLE);
holder.getView(R.id.ll_second).setVisibility(View.GONE);
holder.setText(R.id.tv_title, list4_title[position]);
holder.setText(R.id.tv_price, list4_title_price[position]);
holder.setImageResource(R.id.iv_image, images.get(position));
} else {
holder.getView(R.id.ll_first).setVisibility(View.GONE);
holder.getView(R.id.ll_second).setVisibility(View.VISIBLE);
holder.setText(R.id.tv_title2, list4_title[position]);
holder.setText(R.id.tv_price_2, list4_title_price[position]);
holder.setImageResource(R.id.iv_image2, images.get(position));
}
holder.getItemView().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mView.setGridClickFour(position);
}
});
}
};
}
/**
* 優(yōu)質(zhì)新聞
*/
@Override
public BaseDelegateAdapter initList5() {
LinearLayoutHelper linearLayoutHelper = new LinearLayoutHelper();
linearLayoutHelper.setAspectRatio(4.0f);
linearLayoutHelper.setDividerHeight(5);
linearLayoutHelper.setMargin(0, 0, 0, 0);
linearLayoutHelper.setPadding(0, 0, 0, 10);
// 參數(shù)3:布局文件 參數(shù)4:一頁顯示的個數(shù) 參數(shù)5:int typeFooter = 9 //底部
return new BaseDelegateAdapter(activity, linearLayoutHelper, R.layout.view_vlayout_news, 10, Constant.viewType.typeFooter) {
@Override
public void onBindViewHolder(BaseViewHolder holder, final int position) {
super.onBindViewHolder(holder, position);
// 如果底部新聞?wù)埱蟮臄?shù)據(jù)大于0躺枕,就執(zhí)行if;否則執(zhí)行else
if (Constant.findBottomNews != null && Constant.findBottomNews.size() > 0) {
Log.e("TAG" , "if語句") ;
// HomeBlogEntity model = Constant.findBottomNews.get(position);
// holder.setText(R.id.tv_title, model.getTitle());
// ImageView imageView = holder.getView(R.id.iv_logo);
// ImageUtils.loadImgByPicassoError(activity, model.getImageUrl(), R.mipmap.image_default, imageView);
// holder.setText(R.id.tv_time, model.getTime());
// holder.getItemView().setOnClickListener(new View.OnClickListener() {
// @Override
// public void onClick(View v) {
// mView.setNewsList5Click(position,Constant.findBottomNews.get(position).getUrl());
// }
// });
} else {
// Log.e("TAG" , "else語句") ;
ImageView imageView = holder.getView(R.id.iv_logo);
holder.setText(R.id.tv_title, "官方自營IPhone9 Plus ");
imageView.setImageResource(R.mipmap.test_iphone);
holder.setText(R.id.tv_time, "¥129999");
holder.getItemView().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) { // Constant.findBottomNews.get(position).getUrl()
mView.setNewsList5Click(position,"");
}
});
}
}
};
}
}
3.3:model:用于存放BannerView輪播圖的javabean數(shù)據(jù);
3.4:view:定義fragment包拐云,創(chuàng)建HomeFragment然后實現(xiàn)HomeFragmentContract.View罢猪,然后實現(xiàn)里邊的方法;
1>:直接在HomeFragment中創(chuàng)建presenter對象叉瘩,然后調(diào)用HomeFragmentPresenter中對應(yīng)的方法來獲取返回的數(shù)據(jù)膳帕,從而就可以在HomeFragment中利用返回的數(shù)據(jù)來填充BannerView頁面的數(shù)據(jù)和其他控件的數(shù)據(jù);
代碼如下:
/**
* Email: 2185134304@qq.com
* Created by JackChen 2018/4/9 10:06
* Version 1.0
* Params:
* Description:
*/
public class HomeFragment extends BaseFragment implements View.OnClickListener , HomeFragmentContract.View {
private MainActivity activity;
private HomeFragmentContract.Presenter presenter = new HomeFragmentPresenter(this);
@Bind(R.id.tv_title)
TextView tvTitle;
@Bind(R.id.recyclerView)
RecyclerView recyclerView;
/** 存放各個模塊的適配器*/
private List<DelegateAdapter.Adapter> mAdapters;
private BannerView mBanner;
// private Realm realm;
private static boolean isFirstEnter = true;
private RefreshLayout refreshLayout;
private Intent intent;
@Override
public void onAttach(Context context) {
super.onAttach(context);
activity = (MainActivity) context;
}
@Override
public void onDetach() {
super.onDetach();
if(activity!=null){
activity = null;
}
}
@Override
public void onPause() {
super.onPause();
if(mBanner!=null){
mBanner.pause();
}
}
@Override
public void onResume() {
super.onResume();
if(mBanner!=null){
mBanner.resume();
}
}
@Override
public void onDestroy() {
super.onDestroy();
restore();
presenter.unSubscribe();
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
presenter.subscribe();
}
@Override
public void onClick(View v) {
}
@Override
public int getContentView() {
install();
return R.layout.fragment_example_assign_default; // base_recycler_view
}
@Override
public void initView() {
refreshLayout = (RefreshLayout) activity.findViewById(R.id.refreshLayout);
mAdapters = new LinkedList<>();
// initRealm();
presenter.setActivity(activity);
initRecyclerView();
tvTitle.setText("首頁");
// activity.showToolBar();
}
private void initRecyclerView() {
}
/**
* 設(shè)置輪播圖數(shù)據(jù)
*/
@Override
public void setBanner(BannerView mBanner, List<Object> arrayList) {
this.mBanner = mBanner;
mBanner.setHintGravity(2);
mBanner.setAnimationDuration(1000);
mBanner.setPlayDelay(2000);
mBanner.setHintPadding(0,0,0, SizeUtil.dip2px(activity,10));
mBanner.setAdapter(new BaseBannerPagerAdapter(activity, arrayList));
}
@Override
public void initListener() {
}
@Override
public void initData() {
}
@Override
public void setOnclick(int position) {
}
@Override
public void setMarqueeClick(int position) {
}
@Override
public void setGridClick(int position) {
}
@Override
public void setGridClickThird(int position) {
}
}
/**
* 為您精選
*/
@Override
public void setGridClickFour(int position) {
}
}
@Override
public void setNewsList2Click(int position, String url) {
}
}
}
4. 總結(jié)
上邊啰啰嗦嗦這么多房揭,大家如果不是很清楚或者不是很理解的备闲,也沒有關(guān)系,可以不用看上邊的捅暴,只需要把我下邊的總結(jié)看懂就ok恬砂,照樣也可以很好的把MVP用在項目中。
1>:整個項目涉及到Activity或者Fragment包是ui包蓬痒,然后在ui包下邊創(chuàng)建底部所有的fragment包泻骤,如home、cart梧奢、my狱掂,表示首頁、購物車亲轨、我的趋惨;
2>:全局創(chuàng)建BaseView、BasePresenter惦蚊;
3>:然后針對于home首頁器虾,在里邊創(chuàng)建4個包,分別是contract蹦锋、model兆沙、view、presenter莉掂;
對于contract葛圃,創(chuàng)建HomeFragmentContract接口,需要做兩件事:
第一:定義View接口憎妙,繼承BaseView库正,然后定義一些方法,View下的方法作用是給Activity或者Fragment回調(diào)的厘唾;
第二:定義Presenter接口诀诊,繼承BasePresenter,然后定義一些方法阅嘶,Presenter下的方法作用是寫具體進(jìn)行聯(lián)網(wǎng)請求的代碼,來獲取網(wǎng)絡(luò)返回的數(shù)據(jù);
4>:定義HomeFragmentPresenter讯柔,實現(xiàn)HomeFragmentContract.Presenter抡蛙,然后實現(xiàn)里邊的方法,把每一個需要填充數(shù)據(jù)的控件魂迄,所需要調(diào)用的接口的聯(lián)網(wǎng)請求都寫到對應(yīng)的方法中粗截,然后調(diào)用V層的回調(diào)方法,用于返回數(shù)據(jù)給Activity或者Fragment捣炬;
5>:讓HomeFragment實現(xiàn) HomeFragmentContract.View熊昌,然后實現(xiàn)里邊的方法,即就是V層中的方法湿酸,V層中的方法其實在P層中已經(jīng)獲取到了數(shù)據(jù)婿屹,這里只是通過回調(diào)接口把數(shù)據(jù)回傳給Activity或者Fragment的即可,然后在HomeFragment中直接獲取到數(shù)據(jù)后推溃,就可以給所需要的控件去填充數(shù)據(jù)就ok昂利;
5. 注意:
上邊自己只是舉了一個具體的應(yīng)用場景,我要說的是其他的所有頁面铁坎,不管是其他的Fragment或者是點擊任何一個Fragment中的按鈕或者點擊任何地方的按鈕進(jìn)入某個Activity蜂奸,都是可以使用上邊的方式來處理數(shù)據(jù),也就是說每一個小模塊都需要創(chuàng)建對應(yīng)4個包硬萍,分別是contract扩所、model、view朴乖、presenter祖屏,然后在對應(yīng)的包下創(chuàng)建對應(yīng)的類,然后做對應(yīng)的事情就ok寒砖。
以上就是自己在項目中MVP具體的使用方法赐劣,如果還不是特別清楚的,可以給我發(fā)私信哩都,或者加我qq都是可以的