Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/184.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 正在调用两次RecyclerView无限滚动侦听器_Android_Android Recyclerview - Fatal编程技术网

Android 正在调用两次RecyclerView无限滚动侦听器

Android 正在调用两次RecyclerView无限滚动侦听器,android,android-recyclerview,Android,Android Recyclerview,我有一个RecyclerView,我正试图在其中实现无限滚动功能。问题是,OnScrolled方法中if语句中的代码被执行了两次。这是我目前的代码: public abstract class InfiniteScroll extends RecyclerView.OnScrollListener { private LinearLayoutManager mLayoutManager; private int previousTotal = 0; private boolean loadin

我有一个
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);
}
公共抽象类InfiniteScroll扩展了RecyclerView.OnScrollListener{
私人直线酒店经理;
private int previousTotal=0;
私有布尔加载=真;
私有int visibleThreshold=5;
int firstVisibleItem、visibleItemCount、totalItemCount;
私有int当前页面=1;
公共无限滚动(LinearLayoutManager布局管理器){
mLayoutManager=布局经理;
}
@凌驾
已填空的公共空间(RecyclerView RecyclerView、int dx、int dy){
visibleItemCount=recyclerView.getChildCount();
totalItemCount=mLayoutManager.getItemCount();
firstVisibleItem=mLayoutManager.findFirstVisibleItemPosition();
如果(装载){
如果(totalItemCount>previousTotal){
加载=假;
previousTotal=totalItemCount;
}
}
如果(!loading&&(totalItemCount-visibleItemCount)
试试这个:

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

                }
            }
public void onScrolled(RecyclerView-RecyclerView,int-dx,int-dy){
super.onScrolled(recyclerView、dx、dy);
最终LinearLayoutManager LinearLayoutManager=(LinearLayoutManager)recyclerView.getLayoutManager();
totalItemCount=linearLayoutManager.getItemCount();
lastVisibleItem=linearLayoutManager.findLastVisibleItemPosition();

如果(!loading&&totalItemCount会调用它,因为当您加载更多项目时,会再次调用onScrolled

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

所以你可以检查一下
if(!load&&dy>0)

同样

我刚刚遇到了类似的情况,而解决方案与上面的答案大不相同

在我的例子中,我有一个自定义的RecycleServicewFragment,它将在数据加载开始时设置RecyclerView。我在设置方法块中添加了一个自定义OnScrollListener

我两次调用OnScrollListener的原因是,我不小心在我的RecyclerView中添加了两个OnScrollListener。因此,这两个监听器都将监听器添加到“滚动到结尾”操作中,并为此做些事情

因此,在调用setup方法之前,我只是删除了RecyclerView的所有OnScrollListener,以确保只有一个OnScrollListener

希望这有帮助

if (layoutManager.findLastCompletelyVisibleItemPosition() == 
recyclerAdapter.getItemCount() - 1) {
     //load more items code is here
}

这将起作用。

使用
LimearLayoutManager#findLast[完全]VisibleItemPosition()
method使用此解决方案,您在哪里将加载设置回
false
?否则加载保持为
true
,并且再次到达列表末尾不会触发另一次加载。我在这里发布了一个示例代码:Add loading=false;在loarmore()方法中(最后一行)。您应该在完成所有内容后将加载设置为false。顺便说一句,我已将其添加到“已加载”
的开头,因此不会执行任何操作,是否有理由将其与“加载”
一起使用?我看到它可以与“加载”一起使用!但为什么要在代码之间执行,可以吗?我将其向上移动,如:
如果(dy