我如何创建无尽的两侧滚动RecyclerView?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我如何创建无尽的两侧滚动RecyclerView?相关的知识,希望对你有一定的参考价值。

我看到了this的问题。这个问题的答案是可行的。但是......我必须向两边创建滚动。这个答案帮助我达到了最低点,但是当我到达列表顶部时,我不知道如何发送请求。我尝试使用这样的smth:

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
                if(dy > 0) //check for scroll down
                {

                }
            }
        });

并添加了这个:

if(dy == 0) 
{
           getting some data          
}

但它的工作原理错误。为什么?因为在到达列表底部后加载一些数据后,我的列表会自动到达列表的顶部并再次加载数据。所以我必须再增加一个条件,但我无法想象哪一个。也许有人可以帮助我?

UPDATE

我试着像这样添加smth:

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
                if (dy > 0) //check for scroll down
                {
                  pastVisiblesItems = layoutManager.findFirstVisibleItemPosition();
                  if (loading) {
                      loading = false;
                   }
                }

                if(pastVisiblesItems==5){
                    loading=true;
                }

                if (loading&&recyclerView.canScrollVertically(-1)){
                    if (prev_url != null) {

                        Log.i("m","[]");
                    }
                }
            }
        });

但这个条件:

if (loading&&recyclerView.canScrollVertically(-1)){
                        if (prev_url != null) {

                            Log.i("m","[]");
                        }
                    }

将发送~30个请求,这对我来说是错误的:(

答案

您可以尝试反转条件,以便在滚动侦听器中达到顶部,如下所示:

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
            if(dy > 0) //check for scroll down
            {
                visibleItemCount = mLayoutManager.getChildCount();
                totalItemCount = mLayoutManager.getItemCount();
                pastVisiblesItems = mLayoutManager.findFirstVisibleItemPosition();

                if (loading) 
                {
                    if ( (visibleItemCount + pastVisiblesItems) >= totalItemCount) 
                    {
                        loading = false;
                        Log.v("...", "Last Item Wow !");
                        //Do pagination.. i.e. fetch new data
                    }
                }
            }
            if(dy < 0) //check for scroll up
            {
                visibleItemCount = mLayoutManager.getChildCount();
                pastVisiblesItems = mLayoutManager.findLastVisibleItemPosition();

                if (loading) 
                {
                    if ( (pastVisiblesItems - visibleItemCount) <= 0) 
                    {
                        loading = false;
                        Log.v("...", "First Item Wow !");
                        //Do pagination.. i.e. fetch new data
                    }
                }
            }
        }
    });
另一答案

试试这个解决方案方法loadMorePosts();仅当用户无法再垂直滚动时才会调用。

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);

            Boolean reachedBottom = !recyclerView.canScrollVertically(1);
            if (reachedBottom) {
                loadMorePosts();
            }
        }
     });
    })

创建方法loadMorePosts();在哪里查询下一个数据。或者,您将不得不查看新的分页库。 Documentation here.

以上是关于我如何创建无尽的两侧滚动RecyclerView?的主要内容,如果未能解决你的问题,请参考以下文章

无尽的recyclerview,多种视图类型,OnscrollListener 后崩溃

如何使用卡片创建水平滚动 RecyclerView

创建具有水平和垂直滚动的 RecyclerView

recyclerView.setOnScrollChangeListener 不工作

无尽的滚动监听器

RecyclerView中的CardView垂直滚动