RecyclerView Infinite Scroll监听器被调用两次

Orb*_*bit 8 android android-recyclerview

我有一个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);
}
Run Code Online (Sandbox Code Playgroud)

这个代码是作为一个单独的SO问题的答案发布的,其他示例似乎功能类似,但我仍然得到该loadMore()方法执行两次到达底部时RecyclerView,我不知道为什么.

Sam*_*r J 13

它被调用,因为当你加载更多项时,再次调用onScrolled.

如果在布局计算后可见项目范围发生更改,也将调用此回调.在这种情况下,dx和dy将为0.

所以你可以检查 if (!loading && dy>0) 以及

  • 顺便说一句,我已经将它添加到`onScrolled`的开头,所以没有任何东西会被执行,你是否有理由将它与`!loading`一起使用?我看到它可以和`!loading`一起使用但是为什么要执行中间代码,是不是我把它向上移动如:`if(dy <= 0)return;`,我的意思是我没有看到我的代码有任何问题但是你可能会遇到一些罕见的情况? (3认同)

Sab*_*ari 0

Try this:

 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);

                }
            }
Run Code Online (Sandbox Code Playgroud)