列表不能在ValueEventListener内部更改

时间:2019-03-23 16:33:36

标签: android list firebase firebase-realtime-database

我想将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 个答案:

答案 0 :(得分:1)

addValueEventListener是异步的,并立即返回。您的代码继续执行list_question.get(index),但是list_question仍然为空。数据库查询完成后,直到一段时间后,您提供的侦听器才会被调用。无法保证会花费多长时间。

如果要使用查询结果,则必须等待异步数据库操作完成。这意味着您只能在侦听器回调本身内部使用结果。

答案 1 :(得分:0)

此检索数据的方法是异步的。这意味着这不是按时间顺序执行的。 尝试使用调试模式,您将自己看到在执行其余代码后,它会在侦听器内部执行。 放在 currentQuestion = list_question.get(索引) 在侦听器内部,紧接添加问题的行之后,您将看到它起作用。

答案 2 :(得分:0)

您只是在尝试填充列表之前尝试访问列表。

您可以通过添加if来检查列表的大小。

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

还要确保一旦发生数据更改事件,您就在执行此逻辑。

希望这会有所帮助。

快乐编码:)