Невозможно загрузить больше страниц данных, используя Recycler view android - PullRequest
1 голос
/ 24 октября 2019

Я добавил функцию пагинации в свое приложение, но данные не могут загружаться больше. Когда я устанавливаю лимит в 20 данных, я добавляю 23 данных и загружаю больше, 20 данных невидимы и 3 данных видимы. Может кто-нибудь помочь мне исправить эту ошибку?

Снимок экрана с первыми 20 наборами данных:

1

Снимок экрана при прокрутке:

2

Код:

@Override
protected void onStart() {
    super.onStart();

    collectionReference.limit(20).get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
        @Override
        public void onComplete(@NonNull Task<QuerySnapshot> task) {
            if (task.isSuccessful()) {
                if(!task.getResult().isEmpty()) {
                    documentsList.clear();

                    for (DocumentSnapshot documentSnapshot : task.getResult()) {
                        Documents documents = documentSnapshot.toObject(Documents.class);
                        documentsList.add(documents);
                        documentListAdapter.notifyDataSetChanged();
                        lastVisible = task.getResult().getDocuments().get(task.getResult().size() - 1);
                    }

                    RecyclerView.OnScrollListener onScrollListener = new RecyclerView.OnScrollListener() {
                        @Override
                        public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
                            super.onScrollStateChanged(recyclerView, newState);

                            if (newState == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) {
                                isScrolling = true;
                            }
                        }

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

                            int firstVisibleDocument = layoutManager.findFirstVisibleItemPosition();
                            int visibleDocumentCount = layoutManager.getChildCount();
                            int totalDocumentCount = layoutManager.getItemCount();

                            if (isScrolling && (firstVisibleDocument + visibleDocumentCount == totalDocumentCount) && !isLastItemReached) {
                                isScrolling = false;

                                collectionReferences.startAfter(lastVisible).limit(20).get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                                    @Override
                                    public void onComplete(@NonNull Task<QuerySnapshot> task) {
                                        if (task.isSuccessful()) {
                                            documentsList.clear();

                                            for (DocumentSnapshot documentSnapshot : task.getResult()) {
                                                Documents documents = documentSnapshot.toObject(Documents.class);
                                                documentsList.add(documents);
                                                documentListAdapter.notifyDataSetChanged();
                                                lastVisible = task.getResult().getDocuments().get(task.getResult().size() - 1);
                                            }

                                            if (task.getResult().size() < 20) {
                                                isLastItemReached = true;
                                            }
                                        }
                                    }
                                });
                            }
                        }
                    };

                    recyclerViewDocument.addOnScrollListener(onScrollListener);
                }
            }
        }
    });
}

1 Ответ

1 голос
/ 24 октября 2019

У вас такое поведение, потому что когда вы выполняете второй запрос, чтобы получить эти три новых элемента, вы очищаете свой documentsList, используя следующую строку кода:

documentsList.clear();

Чтобы решить эту проблему, просто удалите егоиз второго запроса, потому что вам нужно добавить больше данных и в список, чтобы не удалить исходный. Я ответил на аналогичный вопрос здесь .

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