然后,就是我们的View层的代码,同样,我对代码做了删减:
@Route(path = BaseConstants.EYEPETIZER_MENU)
public class HomeActivity extends CommonActivity implements HomeContract.IView {
// 实例化Presenter
private HomeContract.IPresenter presenter;
{
presenter = new HomePresenter(this);
}
@Override
protected int getLayoutResId() {
return R.layout.activity_eyepetizer_menu;
}
@Override
protected void doCreateView(Bundle savedInstanceState) {
// …
// 使用Presenter请求数据
presenter.requestFirstPage();
loading = true;
}
private void configList() {
// …
getBinding().rv.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
// 请求下一页的数据
presenter.requestNextPage();
}
}
});
}
// 当请求到结果的时候在页面上做处理,展示到页面上
@Override
public void setFirstPage(List
loading = false;
homeAdapter.addData(itemLists);
}
// 当请求到结果的时候在页面上做处理,展示到页面上
@Override
public void setNextPage(List
loading = false;
homeAdapter.addData(itemLists);
}
@Override
public void onError(String msg) {
ToastUtils.makeToast(msg);
}
// …
}
从上面的代码中我们可以看出实际在View中也要维护一个Presenter的实例。 当需要请求数据的时候会使用该实例的方法来请求数据,所以,在开发的时候,我们需要根据请求数据的情况,在Presenter中定义接口方法。
实际上,MVP的原理就是View通过Presenter获取数据,获取到数据之后再回调View的方法来展示数据。
优点:
缺点:
MVVM 是 Model-View-ViewModel 的简写。它本质上就是 MVC 的改进版。MVVM 就是将其中的 View 的状态和行为抽象化,让我们将视图 UI 和业务逻辑分开