思路:
不多说了,就是 m 不可以和v直接交互,通过中间的p
实现步骤
1.UI逻辑抽象为接口
2.业务逻辑抽象为接口
Activity /其他view 就是View层 只负责UI
Persenter 是业务层 负责逻辑 或数据获取
(后缀Impl代表对应的实现类)
代码演示:
Activity 或者普通view 把ui逻辑抽象为接口文件:
FlashSaleMVPView.java 接口文件
/**
* Created by cuizehui on 17-10-13.
* 抢购界面 UI逻辑
*/
public interface FlashSaleMVPView {
public void reupRepositories(ArrayList<FlashPruductData> repositories);
public MainActivity getMainActivity();
}
实现类:
FlashSaleView.java
注意到这里含有persenterImpl 类的引用对象。
当需要业务逻辑时,则调用PersenterIml 类中的方法 执行业务逻辑
/**
* Created by cuizehui on 17-9-14.
* 抢购界面
*/
public class FlashSaleView extends BasePagerView implements FlashSaleMVPView{
FlashSalePresenterImpl flashSalePresenter;
private RecyclerView recyclerView;
private FlashSaleRecycleViewAdapter flashSaleRecycleViewAdapter;
public FlashSaleView(MainActivity mainActivity) {
super(mainActivity);
}
/***
* mvp模式下 这个类中 不存在这个方法
*/
@Override
protected void initDate() {
super.initDate();
}
@Override
protected void initView() {
super.initView();
//获取引用 并将自己绑定给 presenter
flashSalePresenter=new FlashSalePresenterImpl();
flashSalePresenter.attachView(this);
basePager_fl.removeAllViews();
LayoutInflater inflater =LayoutInflater.from(mainActivity);
View shopview=inflater.inflate(R.layout.main_viewpager_shop,null);
recyclerView=shopview.findViewById(R.id.flash_sale_rv);
setupRecyclerView(recyclerView);
//获取数据 并刷新ui(方法还是在这个类中)
flashSalePresenter.loadRepositories();
basePager_fl.addView(shopview);
}
@Override
protected void initEvent() {
super.initEvent();
}
private void setupRecyclerView(RecyclerView recyclerView) {
flashSaleRecycleViewAdapter=new FlashSaleRecycleViewAdapter();
flashSaleRecycleViewAdapter.setItemClickCallback(new FlashSaleRecycleViewAdapter.ItemClickCallback() {
@Override
public void onItemClick(FlashPruductData flashPruductData) {
flashSalePresenter.jumptoflashSaleProductActivity(flashPruductData);
}
});
recyclerView.setAdapter(flashSaleRecycleViewAdapter);
recyclerView.setLayoutManager(new LinearLayoutManager(mainActivity));
}
@Override
public void reupRepositories(ArrayList<FlashPruductData> repositories) {
//获取同一个??!!!
Log.d("刷新UI","start");
FlashSaleRecycleViewAdapter adapter= (FlashSaleRecycleViewAdapter) recyclerView.getAdapter();
adapter.setFlashSalerepositories(repositories);
adapter.notifyDataSetChanged();
}
@Override
public MainActivity getMainActivity() {
return mainActivity;
}
}
业务逻辑抽象成接口:
FlashSalerPresenter.java 接口
public interface FlashSalePresenter {
public void attachView(FlashSaleMVPView view) ;
public void detachView() ;
/***
* 加载网络数据
*
*/
public void loadRepositories() ;
/**
* 跳转至flashSaleProductActivity
*/
public void jumptoflashSaleProductActivity(FlashPruductData flashPruductData);
}
FlashSalerPresenterImpl.java 实现类
可以看到这里同样获取了 view 的引用,
当业务逻辑执行完毕后,需要调用UI 方法时 ,调用FlashSaleView 接口中的方法更新UI。
public class FlashSalePresenterImpl implements FlashSalePresenter {
public FlashSaleMVPView flashSaleMVPView;
@Override
public void attachView(FlashSaleMVPView view) {
this.flashSaleMVPView=view;
}
@Override
public void detachView() {
this.flashSaleMVPView= null;
}
/**
* 获取抢购 数据Arraylist
*/
@Override
public void loadRepositories() {
ArrayList<FlashPruductData> list=new ArrayList<>();
FlashPruductData flashPruductData1=new FlashPruductData();
flashPruductData1.setProductname("抢购商品1");
flashPruductData1.setStartData("上午11点");
flashPruductData1.setOldprice("100");
flashPruductData1.setFlashprice("20");
FlashPruductData flashPruductData2=new FlashPruductData();
flashPruductData2.setProductname("抢购商品2");
flashPruductData2.setOldprice("200");
flashPruductData2.setFlashprice("20");
FlashPruductData flashPruductData3=new FlashPruductData();
flashPruductData3.setProductname("抢购商品3");
flashPruductData3.setStartData("上午11点");
flashPruductData3.setOldprice("300");
flashPruductData3.setFlashprice("20");
FlashPruductData flashPruductData4=new FlashPruductData();
flashPruductData4.setProductname("抢购商品4");
flashPruductData4.setOldprice("400");
flashPruductData4.setFlashprice("20");
FlashPruductData flashPruductData5=new FlashPruductData();
list.add(flashPruductData1);
list.add(flashPruductData2);
list.add(flashPruductData3);
list.add(flashPruductData4);
list.add(flashPruductData5);
flashSaleMVPView.reupRepositories(list);
}
/**
* 跳转至flashSaleProductActivity
*/
@Override
public void jumptoflashSaleProductActivity(FlashPruductData flashPruductData) {
Log.d("jumpto flash ","start");
Intent intent=new Intent(flashSaleMVPView.getMainActivity(),FlashSaleProductActivity.class);
flashSaleMVPView.getMainActivity().startActivity(intent);
}
}
待优化部分:
这种代码结构适合中型项目, 因为 这样会产生很多的接口类 和实现类。
将业务逻辑和UI逻辑彻底分离,同时可以将 modle 层注入到persenter 层 实现解耦.
优化部分:可以 抽取UI逻辑和view 逻辑的公共逻辑提取成父类或抽象类 等等。 泛型的抽取
具体源码可以在项目中查找:
https://github.com/cuizehui/Estore或者查看此经典案例:
https://github.com/ivacf/archi