使用场景:
在Android页面的显示的时候,往往有很多的页面加载数据分页逻辑。每次的页面处理的话会多次的去书写逻辑判断。显得很繁琐,如何更加简单的实现一个页面的分页逻辑处理。只需要一次的书写就能处理全部的页面。这样就要考虑到数据刷新的封装性。
一般我们的逻辑处理是在每个页面进行逻辑判断,如下:
(1)加入行为,下拉或者上滑的行为习惯,如图1所示:
(2)判断数据处理数据异步后的获取,每次都会去进行数据的判断。如图2所示:
通过上面的描述,完成一个分页式的网络请求的大致的具体步骤:请求数据->解析数据->处理数据,所以能够把这三个步骤全部进行分离开来是很重要的。一般项目的中的使用的都是mvp架构,已经把第一步和第二步进行了分割,普通的逻辑完全可以胜任,但是页面分页逻辑,并没有处理。这样每次的分页的处理还是需要去重新书写这部分的判断。如图3所示:
所以我们可以在上面的基础上加入一层的封装:
新增加两个类专门去处理下拉和上拉分页处理问题
(1)BaseLoadMoreAndRefreshView增加分页行为,包括回调数据,没有更多数据,返回数据是全部为空的处理。
/**
* 上拉下拉处理的分类
*/
public interface BaseLoadMoreAndRefreshView<T> extends BaseView {
/**
* 回调数据
*/
void refreshDate(List<T> list);
/**
* 没有跟多数据
*/
void loadMoreNoDate();
/**
* 空数据页面
*/
void loadEmptyPage();
}
(2)BaseLoadMoreAndRefreshPresenter 处理分页逻辑。
package com.xx.xx.base;
import com.xx.xx.mvp.BasePresenterImpl;
import java.util.ArrayList;
import java.util.List;
/**
* 下拉和上拉数据处理抽象类
*/
public abstract class BaseLoadMoreAndRefreshPresenter
<T, D extends BaseLoadMoreAndRefreshView>
extends BasePresenterImpl<D> {
private int page = 1;
private List<T> mDate = new ArrayList<>();
/**
* 设置页面信息
*
* @param page
*/
public void setStartPage(int page) {
this.page = page;
}
/**
* 获取的主要参数
*
* @param page
*/
protected abstract void loadDate(int page);
/**
* 上拉加载
*/
public void loadMore() {
page++;
loadDate(page);
}
/**
* 下拉刷新
*/
public void refreshDate() {
page = 1;
loadDate(page);
}
/**
* 处理数据,加入分页判断
* @param page
* @param tList
*/
public void showData(int page, List<T> tList) {
if (page == 1) {
if (tList.size() > 0) {
mDate.clear();
mDate.addAll(tList);
mView.refreshDate(mDate);
} else {
mDate.clear();
mView.loadEmptyPage();
}
} else if (page > 1 && tList.size() > 0) {
mDate.addAll(tList);
mView.refreshDate(mDate);
} else {
mView.loadMoreNoDate();
}
}
}
具体使用过程:
(1)界面上使用:
refresh.setOnRefreshLoadMoreListener(new OnRefreshLoadMoreListener() {
@Override
public void onLoadMore(@NonNull RefreshLayout refreshLayout) {
imp.loadMore();
}
@Override
public void onRefresh(@NonNull RefreshLayout refreshLayout) {
imp.refreshDate();
}
});
(2)Presenter实现类中数据解析后进行调取showData方法进行判断:
@Override
public void onResponseSucceed(String json) {
List<CollectionBean> collectionBeans = GsonUtils.jsonToList(json, CollectionBean.class);
if (collectionBeans != null) {
showData(page, collectionBeans);
}
}
(3)页面实现View的接口,进行具体的实现。
@Override
public void refreshDate(List<CollectionBean> list) {
adapter.refreshData(list);
}
@Override
public void loadMoreNoDate() {
ToastUtils.showToast(getString(R.string.on_more_date));
}
@Override
public void loadEmptyPage() {
adapter.setEmptyView(EmptyViewHelperForActivity.getInstance().getErrViewNoDate(CollectionActivity.this));
adapter.refreshData(new ArrayList<>());
}
总结:使用这样的判断处理能够更好地处理分页。