Ошибка базы данных в реальном времени Infinite scrollview firebase

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

SearchRef = FirebaseDatabase.getInstance().getReference().child("Normas");


    if (user != null) {
        getThreads();
        threadsListView.setOnScrollListener(new AbsListView.OnScrollListener() {
            private int currentVisibleItemCount;
            private int currentScrollState;
            private int currentFirstVisibleItem;
            private int totalItem;
            private LinearLayout lBelow;


            @Override
            public void onScrollStateChanged (AbsListView view,int scrollState){
                // TODO Auto-generated method stub
                this.currentScrollState = scrollState;
                this.isScrollCompleted();
            }

            @Override
            public void onScroll (AbsListView view,int firstVisibleItem,
                                  int visibleItemCount, int totalItemCount){
                // TODO Auto-generated method stub
                this.currentFirstVisibleItem = firstVisibleItem;
                this.currentVisibleItemCount = visibleItemCount;
                this.totalItem = totalItemCount;


            }

            private void isScrollCompleted () {
                if (totalItem - currentFirstVisibleItem == currentVisibleItemCount
                        && this.currentScrollState == SCROLL_STATE_IDLE) {
                    /** To do code here*/
                    SearchRef.orderByKey().startAt(oldestPostId).limitToLast(10).addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            for (DataSnapshot child : dataSnapshot.getChildren()) {
                                MessageThread messageThread = child.getValue(MessageThread.class);
                                if (messageThread != null) {
                                    oldestPostId = child.getKey();
                                    messageThread.thread_id = child.getKey();
                                    Log.d(TAG, "onDataChange: " + messageThread.toString());
                                }
                            }
                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {

                        }
                    });

                }
            };

        });
    }



public void getThreads() {
    SearchRef.limitToLast(10).addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            Query ordenar = mDatabase.child("Normas").orderByChild("countthreads");
            threadsList.clear();
            for (DataSnapshot messageThreadSnapshot : dataSnapshot.getChildren()) {
                MessageThread messageThread = messageThreadSnapshot.getValue(MessageThread.class);
                if (messageThread != null) {
                    dataSnapshot.getChildrenCount();
                    messageThread.thread_id = messageThreadSnapshot.getKey();
                    Log.d(TAG, "onDataChange: " + messageThread.toString());
                }
                threadsList.add(messageThread);
            }
            threadsAdapter = new ThreadsAdapter(ThreadsActivity.this, R.layout.threads_listview, threadsList, ThreadsActivity.this, ordenar);
            Collections.reverse(threadsList);
            threadsListView.setAdapter(threadsAdapter);

        }
        @Override
        public void onCancelled(DatabaseError databaseError) {
            Toast.makeText(ThreadsActivity.this, "ThreadsActivity: " + databaseError.getMessage(), Toast.LENGTH_SHORT).show();
        }
    });
}

и это журнал после сбоя:

java.lang.IllegalArgumentException: You must use startAt(String value), endAt(String value) or equalTo(String value) in combination with orderByKey(). Other type of values or using the version with 2 parameters is not supported

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
23
1

Ответы 1

Я предполагаю, что oldestPostId - это null, что недопустимо.

Вы захотите проверить наличие null, прежде чем принимать решение об использовании oldestPostId:

Query query = SearchRef.orderByKey().limitToLast(10);
if (oldestPostId != null) {
  query = query.startAt(oldestPostId);
}
query.addListenerForSingleValueEvent(new ValueEventListener() {
  ...

Кстати: в базе данных Firebase Realtime теперь есть startAfter метод, что означает, что вы не будете получать один и тот же ключ дважды.

Привет, Фрэнк !, я отредактировал свой код с вашим предложением, теперь не выдает никаких ошибок, но после прокрутки вниз он просто перезагружает тот же список.

Diego González 03.04.2021 02:24

Похоже, что oldestPostId никогда не устанавливается. Я рекомендую выполнить код в отладчике и убедиться, что строка, которую вы ожидаете установить для oldestPostId, действительно работает так, как вы ожидаете.

Frank van Puffelen 03.04.2021 02:31

@FrankvanPuffelen Yeey с моей стороны для метода startAfter ()?

Alex Mamo 04.04.2021 13:54

Другие вопросы по теме