一、前言:
我们在网络请求时,总有分页加载等,处理业务逻辑也是比较混乱的,容易出现各种Bug,下面我这种模式用了很久,记录一下,有任何问题,欢迎指正。
二、方式一:
采用 SmartRefreshLayout框架,下拉刷新采用autoRefresh(),上拉加载更多是根据addOnScrollListener()自定义写的。
注意:什么时候加载更多,完全可以自定义。(本文是滑动到数据一半,开始加载更多。)
1、开始请求数据
//触发自动刷新
refreshLayout.autoRefresh();
refreshLayout.setOnRefreshListener(new OnRefreshListener() {
@Override
public void onRefresh(@NonNull final RefreshLayout refreshLayout) {
page = 1;
//必须清空
moreList.clear();
// 下拉刷新
myLessonGoingPresenter.getData(status_going, page, size);
}
});
2、加载更多请求
/**
* 加载更多数据
*/
private void onLoadMore() {
++page;
myLessonGoingPresenter.getData(status_going, page, size);
}
3、数据请求完成处理:
//加载更多标识
private boolean isLoadingMore;
//页码
private int page = 1;
//每页数据
private int size = 10;
//部分刷新起始位置
private int startPosition;
//adapter
private MyLessonAdapter myLessonAdapter;
//展示数据集合
private List moreList = new ArrayList<>();
/**
* 返回数据成功
*
* @param baseHttpResponse
*/
@Override
public void getDataSuccess(BaseHttpListResponse baseHttpResponse) {
try {
//取消加载
isLoadingMore = false;
//刷新完成
refreshLayout.finishRefresh();
List data = baseHttpResponse.data;
//刷新的开始位置
startPosition = moreList.size();
//数据是否大于0
if (data != null && data.size() > 0) {
if (page == 1) {
//第一页数据清空
moreList.clear();
}
//添加数据
moreList.addAll(data);
//显示布局
showLayout(true);
} else if (page == 1 && moreList.size() > 0) {
//第一页无数据,列表有数据,就清空,隐藏列表
showLayout(false);
} else if (page != 1 && moreList.size() > 0) {
//不是第一页无数据,列表有数据,继续展示列表
ToastUtils.showShort("没有更多数据了");
//继续提示加载中,不会刷新下一页了
isLoadingMore = true;
showLayout(true);
} else {
//第一次进来就没有数据,隐藏list列表
showLayout(false);
}
//adapter为空就创建
if (myLessonAdapter == null) {
LinearLayoutManager layoutManager = new LinearLayoutManager(getContext());
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
rvList.setLayoutManager(layoutManager);
myLessonAdapter = new MyLessonAdapter(getContext(), moreList);
rvList.setAdapter(myLessonAdapter);
} else {
//部分刷新
myLessonAdapter.notifyItemRangeInserted(startPosition, moreList.size());
}
/**
* rvList滑动加载更多
*/
rvList.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
//判断是否正在加载
if (isLoadingMore) {
//正在加载中,停止调用接口
} else {
//加载更多
LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
//总条目数据
int itemCount = layoutManager.getItemCount();
//当前屏幕中最后一个可见的item 的postion
int lastPosition = layoutManager.findLastVisibleItemPosition();
//总数减最后一个可见item的值,小于加载条目的一半,就加载下一页,
if ((itemCount - lastPosition) <= size / 2 && dy > 0) {
isLoadingMore = !isLoadingMore;
//加载更多
onLoadMore();
}
}
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
4、布局的显示和隐藏:
/**
* 判断布局是否显示
*
* @param b
*/
private void showLayout(boolean b) {
if (b) {
//显示
rvList.setVisibility(View.VISIBLE);
llNoData.setVisibility(View.GONE);
} else {
//隐藏
moreList.clear();
rvList.setVisibility(View.GONE);
llNoData.setVisibility(View.VISIBLE);
}
}
三、方式二:
采用 SmartRefreshLayout框架,下拉刷新采用autoRefresh(),上拉加载更多采用setEnableAutoLoadMore()。
注意:setEnableAutoLoadMore()只有滑到底部才会加载第二页。
1、 请求数据
//加载更多标识
private boolean isLoadingMore;
//页码
private int page = 1;
//每页数据
private int size = 10;
//部分刷新起始位置
private int startPosition;
//adapter
private MyLessonAdapter myLessonAdapter;
//展示数据集合
private List moreList = new ArrayList<>();
//加载更多标识
private boolean more = false;
//触发自动刷新
refreshLayout.autoRefresh();
//开启自动加载功能(非必须)
refreshLayout.setEnableAutoLoadMore(true);
refreshLayout.setOnRefreshListener(new OnRefreshListener() {
@Override
public void onRefresh(@NonNull RefreshLayout refreshLayout) {
//开始请求
page = 1;
//必须清空
moreList.clear();
refreshLayout.finishLoadMore();
presenter.getOrderInStorageList(searchKey, timeSort, procureType, startTime, endTime, page, CommonConstant.Size);
}
});
refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() {
@Override
public void onLoadMore(@NonNull RefreshLayout refreshLayout) {
//开始请求
if (more) {
++page;
presenter.getOrderInStorageList(searchKey, timeSort, procureType, startTime, endTime, page, CommonConstant.Size);
} else {
ToastUtils.showShort("没有更多数据了");
refreshLayout.finishLoadMore();
}
}
});
2、返回数据
/**
* 订单列表
*/
private void showStorage() {
try {
refreshLayout.finishRefresh();
refreshLayout.finishLoadMore();
if (orderInStorageBeans != null && orderInStorageBeans.size() > 0) {
//返回有数据
more = true;
rv_list.setVisibility(View.VISIBLE);
rl_no_data.setVisibility(View.GONE);
if (page == 1) {
moreList.clear();
}
moreList.addAll(orderInStorageBeans);
} else if (page == 1 && moreList.size() > 0) {
//第一页无数据
more = false;
moreList.clear();
rv_list.setVisibility(View.GONE);
rl_no_data.setVisibility(View.VISIBLE);
} else if (page != 1 && moreList.size() > 0) {
//其它页有数据
more = false;
ToastUtils.showShort("没有更多数据");
rv_list.setVisibility(View.VISIBLE);
rl_no_data.setVisibility(View.GONE);
} else {
more = false;
rv_list.setVisibility(View.GONE);
rl_no_data.setVisibility(View.VISIBLE);
}
if (inWaitStorageAdapter == null) {
LinearLayoutManager layoutManager = new LinearLayoutManager(getContext());
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
rv_list.setLayoutManager(layoutManager);
inWaitStorageAdapter = new InWaitStorageAdapter(R.layout.item_storage_wait_in, moreList);
rv_list.setAdapter(inWaitStorageAdapter);
} else {
inWaitStorageAdapter.notifyDataSetChanged();
}
} catch (Exception e) {
e.printStackTrace();
}
}