刚开始接触mvp结构的时候,网上一搜很多都是理论,要自己敲很是头疼,后来看了一波视屏,感觉真是柳暗花明,醍醐灌顶啊,但是视屏的感觉还是有点不大妥,后面在git看了别人的源码,自己又更改了一下,于是就有了现在这个版本。
开干
- 这是V也就是view的总接口
public interface MvpView {
public interface ManView{
//显示dialog的方法
void showLoading();
//显示数据的方法
void showView(List<ManBean> picList);
}
public interface GirlView{
void showLoading();
void showView(List<GirlBean> picList);
}
}
- 这是M也就是model的总接口
public interface MvpModel {
public interface ManModel{
//这里加载数据
void loadView(FinishLoadListener listener);
//数据加载完后,回调这个方法
interface FinishLoadListener{
void onComplete(List<ManBean> picList);
}
}
public interface GirlModel{
void loadView(FinishLoadListener listener);
interface FinishLoadListener{
void onComplete(List<GirlBean> girlBean);
}
}
}
上面是我们后面要实现的接口,每个方法都有注释,应该没什么问题,我们下面就来看看怎实现
//名字不大好取,大家别搞混了
public class GirlRealizeModel implements MvpModel.GirlModel{
@Override
public void loadView(final FinishLoadListener listener) {
//这里加载网络的那些数据,加载完成之后,就调用这个加载完成的接口,将从网络加载的数据,丢进去,后面由我们mvp的p来处理,因为我这里父类的方法里写的是list数据,这里就回传list数据,大家也可以写成是类,一般json数据都是实体类存的
List<GirlBean> list=new ArrayList<>();
listener.onComplete(list);
}
}
好的,下面来实现GirlView
public class GirlActivity extends Activity implements MvpView.GirlView{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_scenery);
//new 出我们的控制器,并且调用fetch方法
new GirlPresenter(this).fetch();
}
@Override
public void showLoading() {
//加载数据之前调用,显示对话框那些啊,都在这里了
}
@Override
public void showView(List<GirlBean> picList) {
//加载的数据都来到了这里,我们可以给listview加入数据啦,那么是怎么传到这里来的呢,看下面我们mvp的控制器p
}
}
写了这么多我们的p Presenter还没有出现,接下来就是他发挥控制的时候了,有了数据,我们的persenter就要控制数据怎么显示了
public class GirlPresenter {
private MvpModel.GirlModel mModel=new GirlRealizeModel();
private MvpView.GirlView mView;
//构造方法
public GirlPresenter(MvpView.GirlView view){
mView=view;
}
//这里是供activity调用的方法,这里可以看到这个persenter控制着m加载数据,控制v显示不同的数据
public void fetch(){
mView.showLoading();
mModel.loadView(new MvpModel.GirlModel.FinishLoadListener() {
@Override
public void onComplete(List<GirlBean> picList) {
mView.showView(picList);
}
});
}
}
到这里我们的mvp代码就写完了,你会说在接口里还有一个man的接口啊,这里我就不写了,留个大家试试,加深印象,也许你会说为什么要写多个接口呢,一个不就行了嘛,开始我就是写了一个接口,后来发现返回的数据不是都一样的,有的是实体类,有的是list数据,于是就写了多个接口(大家有更好的方法时通知一下哈),楼主写博客的时候重感冒啊,于是就写了伪代码(这不是借口哈),不过说实话六月天感冒,真的觉得好丢人啊,大家也是在工作的同时还要多多注意身体,毕竟身体才是本钱。
传送门,优化了一下模式,增加对view 的绑定跟解绑
https://github.com/WoBuShuo/MVP_Mode