Android Paging库2.1.2 loadAfter无限加载首页问题如何解决
问题原因
- 后端接口分页逻辑不匹配:硬编码传入页码2仍返回第一页,大概率是后端分页参数不兼容导致:要么你请求的分页参数名和后端要求的不一致,要么后端分页起始值为0而非你设置的1,要么后端收到超出总页数的页码时默认返回第一页数据。
- PagedList配置与后端返回不匹配:如果你构建PagedList.Config时设置的pageSize,大于后端单页实际返回的条目数,Paging库会判断当前页加载数据量不足,触发DataSource失效重建,重新走loadInitial加载第一页,看起来就是重复加载第一页。
- 分页结束逻辑缺失:当前你只要接口返回成功就固定传递下一页的key,就算已经没有更多数据也不会通知Paging停止加载,会导致无限触发加载逻辑,一旦加载过程中出现DataSource重建就会回到第一页。
- DataSource被频繁触发重建:如果你在页面刷新、生命周期回调或者其他逻辑里频繁调用DataSource.invalidate(),或者每次页面可见时都重新创建PagedList实例,都会导致DataSource重新初始化,走loadInitial加载第一页。
修复方案
- 首先排查接口问题:抓包确认请求中的页码参数是否正确传递,核对后端接口文档的分页参数名、分页起始值规则。如果是参数名错误,修改ApiInterface中对应方法的参数注解;如果后端分页从0开始,把常量
FIRST_PAGE的值改为0即可。 - 对齐PagedList配置:构建PagedList.Config时,
setPageSize传入的值要和后端单页返回的条目数完全一致,同时建议关闭占位符避免异常预加载,示例代码:
PagedList.Config pagedConfig = new PagedList.Config.Builder() .setPageSize(20) // 与后端单页返回数量一致 .setEnablePlaceholders(false) .setInitialLoadSizeHint(20) .build();
- 补充分页终止逻辑:
loadAfter中判断返回的条目数量,如果小于pageSize说明没有更多数据,下一页key传null通知Paging停止加载:
@Override public void loadAfter(@NonNull PageKeyedDataSource.LoadParams<Integer> params, @NonNull PageKeyedDataSource.LoadCallback<Integer, Items> callback) { ApiClient.getApiClient().getApiInterface().getMerchantTransactions(bearerToken, merchantId, params.key) .enqueue(new Callback<MainResponse>() { @Override public void onResponse(Call<MainResponse> call, Response<MainResponse> response) { if (response.body() != null){ int code = response.body().getCode(); if (code == SERVER_OK_CODE){ List<Items> items = response.body().getData().getItems(); // 20为你配置的pageSize,小于该值说明无更多数据 Integer nextKey = items.size() >= 20 ? params.key + 1 : null; callback.onResult(items, nextKey); } else if (code == SERVER_UNAUTHENTICATED_CODE){ repository.clearCache(); HelperMethods.signOut(context); } } } @Override public void onFailure(Call<MainResponse> call, Throwable t) { // 建议补充失败重试逻辑,避免无响应导致DataSource重建 } }); }
- 避免DataSource重复初始化:ViewModel中的PagedList实例仅初始化一次,不要在Activity/Fragment的onResume等生命周期方法中重复触发PagedList的创建,下拉刷新逻辑仅在用户主动触发时调用DataSource的invalidate方法。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

