android 首页请求数据完整逻辑,Android 网路请求列表返回逻辑处理

本文介绍了两种使用SmartRefreshLayout框架实现下拉刷新和上拉加载更多的方法。方式一是通过addOnScrollListener自定义加载更多逻辑,当滑动到数据一半时开始加载。方式二是设置setEnableAutoLoadMore,仅在滑动到底部时加载下一页。在数据请求完成后,更新UI并处理无数据和加载状态。这两种方法都确保了网络请求的灵活性和用户体验。
摘要由CSDN通过智能技术生成

一、前言:

我们在网络请求时,总有分页加载等,处理业务逻辑也是比较混乱的,容易出现各种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();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值