Как я могу создать бесконечный двухсторонний скролл-ресивлерView? - PullRequest
3 голосов
/ 28 марта 2019

Я видел этот вопрос.Ответ на этот вопрос осуществим.НО ... Я должен создать прокрутку в обе стороны.Этот ответ помог мне достичь дна, но я не знаю, как отправить запрос, когда достигну вершины списка.Я пытался использовать что-то вроде этого:

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          
}

, но это работает неправильно.Зачем?Потому что после загрузки некоторых данных после достижения нижней части списка, мой список автоматически достигает верхней части списка и загрузка данных снова.Поэтому я должен добавить еще одно условие, но я не представляю, какое именно.Может быть, кто-то может мне помочь?

ОБНОВЛЕНИЕ

Я пытался добавить что-то вроде этого:

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 запросов, и это будет неправильно для меня: (

Ответы [ 2 ]

1 голос
/ 28 марта 2019

Вы можете попробовать инвертировать условия для достижения вершины в слушателе прокрутки, как показано ниже:

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
                    }
                }
            }
        }
    });
1 голос
/ 28 марта 2019

Попробуйте это решение.Метод 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 ();где вы запрашиваете следующие данные.В качестве альтернативы вам придется заглянуть в новую библиотеку подкачки. Документация здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...