Firebase слушатель в слушателе пропущен - PullRequest
2 голосов
/ 20 апреля 2019

В моем приложении я использую базу данных Firebase. Есть вопросы и соответствующие комментарии, хранящиеся в отдельных узлах. Теперь я пытаюсь получить вопросы от одного слушателя и получить доступ к комментариям со вторым слушателем. К сожалению, меня смущает их поведение: recyclerView всегда получает пустой questionsList, как будто второй слушатель пропускается. Но после того, как recyclerView получил список и настроил адаптер, мой LogCat начинает печатать вопросы и информацию о комментариях. Но почему recyclerView заполняется и используется до завершения цикла for, который обрабатывает данные?

Метод получения информации:

private void getQuestionsFromDatabase() {

    mQuestions.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            questionList = new ArrayList<>();
            for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) {

                final String title = dataSnapshot1.child("title").getValue().toString();
                final String question = dataSnapshot1.child("question").getValue().toString();
                final String commentId = dataSnapshot1.child("commentId").getValue().toString();

                mComments.child(commentId).addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                        count = dataSnapshot.getChildrenCount();

                        QuestionModel questionModel = new QuestionModel(title, question, commentId, String.valueOf(count));
                        questionList.add(questionModel);

                    }

                    @Override
                    public void onCancelled(@NonNull DatabaseError databaseError) {

                    }
                });

            }

            Log.d("questionList length: ", String.valueOf(questionList.size()));
            recyclerViewAdapter = new RecyclerViewQuestionAdapter(questionList, getActivity());
            recyclerViewlayoutManager = new LinearLayoutManager(getActivity());
            recyclerView.setLayoutManager(recyclerViewlayoutManager);
            recyclerView.setAdapter(recyclerViewAdapter);

        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }

    });

}

1 Ответ

1 голос
/ 20 апреля 2019

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

                mComments.child(commentId).addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                    count = dataSnapshot.getChildrenCount();

                    QuestionModel questionModel = new QuestionModel(title, question, commentId, String.valueOf(count));
                    questionList.add(questionModel);
                    Log.d("questionList length: ", String.valueOf(questionList.size()));
                    recyclerViewAdapter = new RecyclerViewQuestionAdapter(questionList, getActivity());
                    recyclerViewlayoutManager = new LinearLayoutManager(getActivity());
                    recyclerView.setLayoutManager(recyclerViewlayoutManager);
                    recyclerView.setAdapter(recyclerViewAdapter);

                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {

                }
            });

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