我想将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);
我的代码中缺少什么?
答案 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);
还要确保一旦发生数据更改事件,您就在执行此逻辑。
希望这会有所帮助。
快乐编码:)