RecyclerView Infinite Scroll监听器被调用两次

时间:2016-02-09 06:47:00

标签: 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);
}

此代码是作为单独的SO问题的答案发布的,其他示例似乎功能相似,但是当到达loadMore()的底部时,我仍然会执行两次RecyclerView方法,并且我不知道为什么。

4 个答案:

答案 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。

希望得到这个帮助。