MVP从入门到...

想要设计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的规律了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值