MVP(P层从M层拿来数据,去V层展示,在MainActivity里做一些功能)
MVP:(Model,View,Presenter)架构模式.看起来类似MVC,其实不然.从上图能看到Model层和View层没有相连接,完全解耦.
1.用户触碰界面触发事件,View层把事件通知Presenter层,Presenter层通知Model层处理这个事件,Model层处理后把结果发送到Presenter层,Presenter层再通知View层,最后View层做出改变.这是一整套流程.
2.①M层:模型层(Model),此层和MVC中的M层作用类似.
②V层:视图层(View),在MVC中V层只包含XML文件,而MVP中V层包含XML,Activity和Fragment三者.理论上V层不涉及任何逻辑,只负责界面的改变,尽量把逻辑处理放到M层.
③P层:通知层(Presenter),P层的主要作用就是连接V层和M层,起到一个通知传递数据的作用.
//用MVP实现XListView上拉加载下拉刷新、base基类抽取//
1.新建一个类BaseActivity,继承AppCompatActivity, abstract修饰,定义方法执行
public abstract class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
init();
}
//获取布局文件
protected abstract int getLayout();
//初始化
protected abstract void initView();
//设置监听
protected abstract void setOnClick();
//页面逻辑
protected abstract void pageLogic();
void init(){
if (getLayout()!=0){
setContentView(getLayout());
initView();
setOnClick();
pageLogic();
}else {
throw new IllegalStateException("请加载布局文件");
}
}
}
2.MainActivity继承BaseActivity实现在BaseActivity里面写的4个的方法
3.新建一个接口MyCallBack(回调的方法) 泛型
4.①新建一个Model接口
②新建一个类ModelImpel实现Model接口 (写一个获取网络数据的工具类)
public class ModelImpe implements Model{
private MyCallBack callBack;
@Override
public void getData(String url, int index, MyCallBack callBack) {
this.callBack=callBack;
new MyTask().execute(url+index);
}
class MyTask extends AsyncTask<String,Void,MyData>{
@Override
protected MyData doInBackground(String... strings) {
try {
String data = HttpUtils.get(strings[0]);
Gson gson=new Gson();
MyData myData = gson.fromJson(data, MyData.class);
return myData;
} catch (Exception e) {
callBack.setError(e.getMessage()+"异常");
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(MyData myData) {
super.onPostExecute(myData);
callBack.setData(myData);
}
}
5.新建一个IView接口
6.①新建Presenter接口
②新建一个类PresenterImpel实现Presenter接口
public class PresenterIemp implements Presenter{
private ModelImpe modelImpe;
private IView iView;
public PresenterIemp(IView iView){
this.iView=iView;
modelImpe=new ModelImpe();
}
@Override
public void start(String url, int index) {
modelImpe.getData(url, index, new MyCallBack() {
@Override
public void setData(Object url) {
iView.success(url);
}
@Override
public void setError(Object error) {
iView.error(error);
}
});
}
7.封装基本类、写适配器
8.MainActivity具体执行代码
public class MainActivity extends BaseActivity implements XListView.IXListViewListener,IView {
private ArrayList<MyData.DataBean> mList = new ArrayList<>();
private int mIndex = 1;
private String mUrl = "http://www.xieast.com/api/news/news.php?page=";
private XListView xListView;
private MyAdapter adapter;
private PresenterIemp presenter;
@Override
protected int getLayout() {
return R.layout.activity_main;
}
@Override
protected void initView() {
xListView = findViewById(R.id.XlistView);
xListView.setPullLoadEnable(true);
xListView.setXListViewListener(this);
}
@Override
protected void setOnClick() {
}
@Override
protected void pageLogic() {
presenter = new PresenterIemp(this);
adapter = new MyAdapter(mList,this);
xListView.setAdapter(adapter);
presenter.start(mUrl,mIndex);
}
@Override
public void onRefresh() {
mIndex=1;
mList.clear();
presenter.start(mUrl,mIndex);
}
@Override
public void onLoadMore() {
mIndex++;
presenter.start(mUrl,mIndex);
}
@Override
public void success(Object data) {
MyData myData=(MyData) data;
mList.addAll(myData.getData());
adapter.notifyDataSetChanged();
stop();
}
@Override
public void error(Object error) {
}
private void stop(){
xListView.stopLoadMore();
xListView.stopRefresh();
xListView.setRefreshTime("刚刚");
}
}