在recyclerView 预加载遇到的问题 解决方法
其中以下为全局变量
private LinearLayoutManager linearLayoutManager;
private int currentItemPosition = 0; //用于临时保存第一出现要刷新数据时的item的position
private boolean isNoMoreData; //为 根据服务器返回的数据 是否有更多数据
private int startLoadMorePosition = 3 ;// 当item滑动到list的倒数第三个位置是开启预加载
以下为关键代码:
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
LinearLayoutManager manager = (LinearLayoutManager) recyclerView.getLayoutManager();
int lastVisibleItemPosition = manager.findLastVisibleItemPosition(); //当前屏幕中最后一个可见的item 的postion
int itemCount = manager.getItemCount(); // 获取item的总数
if (lastVisibleItemPosition == (itemCount - startLoadMorePosition ) && dy >0
&& currentItemPosition !=lastVisibleItemPosition ){
currentItemPosition = lastVisibleItemPosition; //记录item的position
if (!isNoMoreData){
// 开始加载
presenter.getList(getJSon(key,pageIndex));
}
}
}
});
另外需要注意的是 在下拉刷新的是 需要将 currentItemPosition 置位0 恢复初始值
refreshLayout.setOnRefreshListener(new OnRefreshListener() {
@Override
public void onRefresh(@NonNull RefreshLayout refreshLayout) {
currentItemPosition = 0;
// 你的下拉刷新代码
}
});
最下面是 对上面用法 我的解释 欢迎指正:
lastVisibleItemPosition == (itemCount - startLoadMorePosition ) 放item的倒数第三个可见时 开始预加载
dy > 0 表示 只有向下滑动屏幕 才可以
currentItemPosition !=lastVisibleItemPosition 为了解决 recyclerView 滑动期间 倒数第三个item
从开始可见到完全可见过程中可能出现一直请求的方案.
当倒数第三个item 开始可见时 (刚刚从屏幕底部滑动出现时)
currentItemPosition 来记录lastVisibleItemPosition
在从可见到完全可见 滑动过程中 lastVisibleItemPosition一直不变, 这样完全避免了,滑动过程中 .多次请求的问题