список не может измениться внутри ValueEventListener - PullRequest
0 голосов
/ 23 марта 2019

Я хочу поместить данные из базы данных Firebase в список, однако получаю ошибку: «java.lang.IndexOutOfBoundsException: недопустимый индекс 0, размер равен 0», я даже пытался добавить в список вручную внутри valueEventListener как показано в комментарии, но все равно пусто

это мой код:

public class Playing extends AppCompatActivity implements View.OnClickListener {

public static List<Question> list_question=new ArrayList<>();
Question currentQuestion;
int index=0; 


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_playing);
    final DatabaseReference myRef = FirebaseDatabase.getInstance().getReference().child("quiz");

    myRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            /* 

            Question question=new Question();
            question.setQuestion("eeee");
            question.setAnswerA("zzzzz");
            question.setAnswerB("aazss");
            question.setAnswerC("ytyty");
            question.setAnswerD("jkjkjkjk");
            question.setCorrectAnswer("A");
            list_question.add(question);
             */

            for (DataSnapshot ds:dataSnapshot.child("questions").getChildren())
            {
                Question question=new Question();
                question.setQuestion(ds.child("question").getValue().toString());
                question.setAnswerA(ds.child("A").getValue().toString());
                question.setAnswerB(ds.child("B").getValue().toString());
                question.setAnswerC(ds.child("C").getValue().toString());
                question.setAnswerD(ds.child("D").getValue().toString());
                question.setCorrectAnswer(ds.child("sol").getValue().toString());
                list_question.add(question);
            }


        }

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

        }
    });


    currentQuestion = list_question.get(index);

Чего не хватает в моем коде?

Ответы [ 3 ]

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

addValueEventListener является асинхронным и возвращается немедленно. Ваш код продолжает выполнять list_question.get(index), но list_question все еще пуст. Предоставленный вами прослушиватель не будет вызван до тех пор, пока через некоторое время запрос к базе данных не будет завершен. Нет гарантии, сколько времени это займет.

Если вы хотите использовать результаты запроса, вы должны дождаться завершения асинхронной операции с базой данных. Это означает, что вы можете использовать результаты только внутри самого обратного вызова слушателя.

0 голосов
/ 23 марта 2019

Просто вы пытаетесь получить доступ к списку до его заполнения.

Вы можете проверить размер списка, поставив if.

if(list_question.size() > 0)
  currentQuestion = list_question.get(index);

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

Надеюсь, это поможет.

Удачного кодирования:)

0 голосов
/ 23 марта 2019

Этот метод для извлечения данных является асинхронным.Это означает, что это не выполняется в хронологическом порядке.Попробуйте использовать режим отладки, и вы увидите, что он выполняет внутреннюю часть слушателя после выполнения остальной части кода.Поместите currentQuestion = list_question.get (index) внутри слушателя, сразу после строки, где вы добавляете свой вопрос, и вы увидите, что он работает.

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