MVP简介+XListView+base

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("刚刚");
}

}

猜你喜欢

转载自blog.csdn.net/qq_43603312/article/details/84865111
MVP