我有一个RecyclerView
我试图实现无限滚动功能。问题是,OnScrolled
方法中if语句中的代码正在执行两次。继承了我目前的代码:
public abstract class InfiniteScroll extends RecyclerView.OnScrollListener {
private LinearLayoutManager mLayoutManager;
private int previousTotal = 0;
private boolean loading = true;
private int visibleThreshold = 5;
int firstVisibleItem, visibleItemCount, totalItemCount;
private int current_page = 1;
public InfiniteScroll(LinearLayoutManager layoutManager) {
mLayoutManager = layoutManager;
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
visibleItemCount = recyclerView.getChildCount();
totalItemCount = mLayoutManager.getItemCount();
firstVisibleItem = mLayoutManager.findFirstVisibleItemPosition();
if (loading) {
if (totalItemCount > previousTotal) {
loading = false;
previousTotal = totalItemCount;
}
}
if (!loading && (totalItemCount - visibleItemCount)
<= (firstVisibleItem + visibleThreshold)) {
// End has been reached
// Do something
current_page++;
Log.d("moreitems", "why is this being called twice?");
loadMore(current_page);
loading = true;
}
}
public abstract void loadMore(int current_page);
}
此代码是作为单独的SO问题的答案发布的,其他示例似乎功能相似,但是当到达loadMore()
的底部时,我仍然会执行两次RecyclerView
方法,并且我不知道为什么。
答案 0 :(得分:10)
它被调用,因为当你加载更多项时,会再次调用onScrolled。
如果布局计算后可见项目范围发生变化,也会调用此回调。在这种情况下,dx和dy将为0.
所以你可以检查一下
if (!loading && dy>0)
以及
答案 1 :(得分:0)
试试这个:
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
final LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
totalItemCount = linearLayoutManager.getItemCount();
lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition();
if (!loading && totalItemCount <= (lastVisibleItem + visibleThreshold)) {
loading = true;
// End has been reached
// Do something
current_page++;
Log.d("moreitems", "why is this being called twice?");
loadMore(current_page);
}
}
答案 2 :(得分:0)
if (layoutManager.findLastCompletelyVisibleItemPosition() ==
recyclerAdapter.getItemCount() - 1) {
//load more items code is here
}
这样可行。
答案 3 :(得分:-1)
我刚刚遇到了类似的情况,而解决方案与上述答案截然不同。
就我而言,我有一个自定义的RecyclerViewFragment,它将在数据加载开始时设置RecyclerView。我在该设置方法块中添加了一个自定义的OnScrollListener。
我之所以调用两次OnScrollListener是因为我意外地将两个OnScrollListener添加到我的RecyclerView中。因此,这两个监听器将同时监听“滚动到结尾”动作并为此做一些事情。
所以我在调用set up方法之前删除了我的RecyclerView的所有OnScrollListener,以确保只有一个OnScrollListener。
希望得到这个帮助。