想要设计mvp首先需要设计我们的基础model,基础view,基础presenter
基础model我们的业务处理基础类是一个接口可以在里面添加我们需要的共通业务接口代码如下:
public interface BaseModel {
}
简单吧我这里因为没共通业务处理所以就没添加任何接口方法
再来个差不多一样简单的我们的共通view代码如下
public interface BaseView {
void showLoading(String title);
void stopLoading();
void showErrorTip(String msg);
}
这几个方法可以没有哦基本内容跟basemodel一致
最后就是我们的基础presenter类了
public abstract class BasePresenter<T, E> {
public Context mContext;
public E mModel;
public T mView;
public void setVM(T v, E m) {
this.mView = v;
this.mModel = m;
this.onStart();
}
//presenter开始
public void onStart() {
}
//presenter结束
public void onDestroy() {
}
}
在这里我们通过setVM方法将model跟view注入到我们的presenter中,当然我们也可以通过构造方法将model跟view注入到presenter中实现presenter对model跟view对象的持有操作。
这样的话我们的基础类就都有啦那接下来我们来看看如何运用它们,首先看看我们的baseActivity是如何处理的。
public abstract class BaseActivity<T extends BasePresenter, E extends BaseModel> extends AppCompatActivity {
public Context mContext;
public T mPresenter;
public E mModel;
@Override
public void onCreate(Bundle savedInstanceState) {
doBeforeSetcontentView();
super.onCreate(savedInstanceState);
setContentView( getLayoutId());
mContext = this;
mPresenter = TUtil.getT(this, 0);
mModel = TUtil.getT(this, 1);
if (mPresenter != null) {
mPresenter.mContext = this;
}
initPresenter();
initView();
}
//获取布局文件
public abstract int getLayoutId();
//简单页面无需mvp就不用管此方法即可,完美兼容各种实际场景的变通
public abstract void initPresenter();
//初始化view
public abstract void initView();
//设置layout前配置
private void doBeforeSetcontentView() {
AppManager.getAppManager().addActivity(this); // 把actvity放到application栈中管理
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);// 设置竖屏
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mPresenter != null) mPresenter.onDestroy();
}
}
通过继承baseactivity的处理我们的子activity就具备了mvp的功能了可能有疑惑的地方时Tutil是干什么用的下面是TUtil的代码
public class TUtil {
public static <T> T getT(Object o, int i) {
try {
return ((Class<T>) ((ParameterizedType) (o.getClass().getGenericSuperclass())).getActualTypeArguments()[i]).newInstance();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static Class<?> forName(String className) {
try {
return Class.forName(className);
} catch (ClassNotFoundException e) {
e.printStackTrace();
return null;
}
}
}
也就是通过TUtil 获取我们具体的presenter跟model实例
最后使我们的应用环节了
public class NewsListFragment extends BaseFragment<NewsListPresenter, NewsListModel> implements NewsListView, OnRefreshListener, OnLoadMoreListener {
@Bind(R.id.irc)
IRecyclerView irc;
@Bind(R.id.loadedTip)
LoadingTip loadedTip;
private NewListAdapter newListAdapter;
private List<NewsSummary> datas = new ArrayList<>();
private String mNewsId;
private String mNewsType;
private int mStartPage = 0;
//baseFragment处理-----------------------------------------------------------------------------------------------------
@Override
protected int getLayoutResource() {
return R.layout.framents_news;
}
@Override
public void initPresenter() {
mPresenter.setVM(this, mModel);
}
@Override
protected void initView() {
//----初始化过程presenter调用方法获取数据
mPresenter.getNewsListDataRequest(mNewsType, mNewsId, mStartPage);
}
//view接口处理---------------------------------------------------------------------------------------------------------
@Override
public void returnNewsListData(List<NewsSummary> newsSummaries) {
//presenter回调的处理在activity中处理view的逻辑
if (newsSummaries != null) {
mStartPage += 20;
if (newListAdapter.getPageBean().isRefresh()) {
irc.setRefreshing(false);
newListAdapter.replaceAll(newsSummaries);
} else {
if (newsSummaries.size() > 0) {
irc.setLoadMoreStatus(LoadMoreFooterView.Status.GONE);
newListAdapter.addAll(newsSummaries);
} else {
irc.setLoadMoreStatus(LoadMoreFooterView.Status.THE_END);
}
}
}
}
@Override
public void scrolltoTop() {
irc.smoothScrollToPosition(0);
}
@Override
public void showLoading(String title) {
if (newListAdapter.getPageBean().isRefresh()) {
loadedTip.setLoadingTip(LoadingTip.LoadStatus.loading);
}
}
@Override
public void stopLoading() {
loadedTip.setLoadingTip(LoadingTip.LoadStatus.finish);
}
@Override
public void showErrorTip(String msg) {
if (newListAdapter.getPageBean().isRefresh()) {
loadedTip.setLoadingTip(LoadingTip.LoadStatus.error);
loadedTip.setTips(msg);
irc.setRefreshing(false);
} else {
irc.setLoadMoreStatus(LoadMoreFooterView.Status.ERROR);
}
}
//recycleView借口-----------------------------------------------------------------------------------------------------------------------------
@Override
public void onLoadMore(View loadMoreView) {
//---
}
@Override
public void onRefresh() {
//---
}
}
presenter的处理
public class NewsListPresenter extends BasePresenter<NewsListView, NewsListModel> {
@Override
public void onStart() {
super.onStart();
//监听返回顶部动作
mRxManage.on(FirstConstant.NEWS_LIST_TO_TOP, new Action1<Object>() {
@Override
public void call(Object o) {
mView.scrolltoTop();
}
});
}
/**
* 请求获取列表数据
*/
public void getNewsListDataRequest(String type, String id, int startPage) {
mRxManage.add(mModel.getNewsListData(type, id, startPage).subscribe(new RxSubscriber<List<NewsSummary>>(mContext, false) {
@Override
public void onStart() {
super.onStart();
mView.showLoading("请稍后...");
}
@Override
protected void _onNext(List<NewsSummary> newsSummaries) {
mView.returnNewsListData(newsSummaries);
mView.stopLoading();
}
@Override
protected void _onError(String message) {
mView.showErrorTip(message);
}
}));
}
}
到这里就介绍完了mvp了其实看完了这篇博客可能你还是有些蒙按照我的基础类创建自己的activity练几次然后你就找到mvp的规律了。