1. MVP简介
M就是model,里边放的是javabean;
V就是View,就是Activity、Fragment;
P就是Presenter;
2. 自己使用
全局需要定义:
定义BaseView、BasePresenter,BaseView是View的父类,BasePresenter是Presenter的父类;
举例:这里以请求HomeFragment的 BannerView轮播图数据为例,结构如下:
由上图可以看出
1>:整个项目底部来回切换的多个fragment都是放在ui包下边的;
2>:自己手动新建一个contract包,定义HomeFragmentContract接口,在里边定义View继承BaseView,里边的方法用于给Activity或者Fragment回调;定义Presenter继承BasePresenter,里边的方法用于写具体的联网请求的逻辑代码,目的就是把具体联网请求的方法和给Activity、Fragment中提供的方法分开,达到最大程度解耦;
下边以home首页的fragment为例,定义4个包,分别是contract、model、view、presenter;
3. 具体分析
3.1:定义HomeFragmentContract接口,代码如下:
/**
* Email: [email protected]
* Created by JackChen 2018/4/8 17:34
* Version 1.0
* Params:
* Description: :Home主页面
*/
public interface HomeFragmentContract {
//View(activity/fragment)继承,需要实现的方法
interface View extends BaseView {
//设置轮播图
void setBanner(BannerView mBanner, List
contract中需要做的事:
1>:写一个 View接口用于继承BaseView,View就指的是Activity、Fragment,里边写的方法就是Activity或者Fragment中所需要实现的方法名字;
2>:写一个 Presenter接口继承BasePresenter控制器,里边的方法就是具体的联网请求的方法;
3.2:自己定义一个 HomeFragmentPresenter,只实现 HomeFrgmentContract.Presenter,然后复写所有的方法,而不实现HomeFragmentContract.View,目的是让Activity或者Fragment实现,这里就是让HomeFragment实现HomeFragmentContract.View,然后实现具体方法:
1>:HomeFrgmentContract中的View下边的方法,是让Activity、Fragment中回调的方法;
2>:HomeFragmentContract中的 Presenter下边的方法,是在HomeFragmentPresenter中实现的方法,然后把具体的联网请求的数据都写到Presenter下边的方法,只需要返回数据的结果给Activity或者Fragment就可以;
具体代码如下:
/**
* Email: [email protected]
* 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) {
//初始化
//创建VirtualLayoutManager对象
VirtualLayoutManager layoutManager = new VirtualLayoutManager(activity);
recyclerView.setLayoutManager(layoutManager);
//设置回收复用池大小,(如果一屏内相同类型的 View 个数比较多,需要设置一个合适的大小,防止来回滚动时重新创建 View)
RecyclerView.RecycledViewPool viewPool = new RecyclerView.RecycledViewPool();
recyclerView.setRecycledViewPool(viewPool);
viewPool.setMaxRecycledViews(0, 20);
//设置适配器
DelegateAdapter delegateAdapter = new DelegateAdapter(layoutManager, true);
recyclerView.setAdapter(delegateAdapter);
return delegateAdapter;
}
/**
* 设置轮播图数据
* @return
*/
@Override
public BaseDelegateAdapter initBannerAdapter() {
final List
3.3:model:用于存放BannerView轮播图的javabean数据;
3.4:view:定义fragment包,创建HomeFragment然后实现HomeFragmentContract.View,然后实现里边的方法;
1>:直接在HomeFragment中创建presenter对象,然后调用HomeFragmentPresenter中对应的方法来获取返回的数据,从而就可以在HomeFragment中利用返回的数据来填充BannerView页面的数据和其他控件的数据;
代码如下:
/**
* Email: [email protected]
* 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 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() {
}
/**
* 设置轮播图数据
*/
@Override
public void setBanner(BannerView mBanner, List
4. 总结
上边啰啰嗦嗦这么多,大家如果不是很清楚或者不是很理解的,也没有关系,可以不用看上边的,只需要把我下边的总结看懂就ok,照样也可以很好的把MVP用在项目中。
1>:整个项目涉及到Activity或者Fragment包是ui包,然后在ui包下边创建底部所有的fragment包,如home、cart、my,表示首页、购物车、我的;
2>:全局创建BaseView、BasePresenter;
3>:然后针对于home首页,在里边创建4个包,分别是contract、model、view、presenter;
对于contract,创建HomeFragmentContract接口,需要做两件事:
第一:定义View接口,继承BaseView,然后定义一些方法,View下的方法作用是给Activity或者Fragment回调的;
第二:定义Presenter接口,继承BasePresenter,然后定义一些方法,Presenter下的方法作用是写具体进行联网请求的代码,来获取网络返回的数据;
4>:定义HomeFragmentPresenter,实现HomeFragmentContract.Presenter,然后实现里边的方法,把每一个需要填充数据的控件,所需要调用的接口的联网请求都写到对应的方法中,然后调用V层的回调方法,用于返回数据给Activity或者Fragment;
5>:让HomeFragment实现 HomeFragmentContract.View,然后实现里边的方法,即就是V层中的方法,V层中的方法其实在P层中已经获取到了数据,这里只是通过回调接口把数据回传给Activity或者Fragment的即可,然后在HomeFragment中直接获取到数据后,就可以给所需要的控件去填充数据就ok;
5. 注意:
上边自己只是举了一个具体的应用场景,我要说的是其他的所有页面,不管是其他的Fragment或者是点击任何一个Fragment中的按钮或者点击任何地方的按钮进入某个Activity,都是可以使用上边的方式来处理数据,也就是说每一个小模块都需要创建对应4个包,分别是contract、model、view、presenter,然后在对应的包下创建对应的类,然后做对应的事情就ok。
以上就是自己在项目中MVP具体的使用方法,如果还不是特别清楚的,可以给我发私信,或者加我qq都是可以的