[我正在尝试使用我的Firebase数据库在android中创建测验,在此,我希望有不会重复的随机生成问题。
到目前为止,我已经成功地开发了一个随机生成的问题的测验,尽管可以重复相同的问题。
例如:我问了四个问题,这些问题来自我的Firebase数据库,我的任何问题都可以使用。它可能会在问题1中显示ID为4的问题。问题2可能会再次显示ID为4的问题,因为没有什么可说的,因此无法显示问题4。
FirebaseAuth mFirebaseAuth = FirebaseAuth.getInstance();
FirebaseUser user = mFirebaseAuth.getCurrentUser();
userid = Objects.requireNonNull(user).getUid();
mRootRef = FirebaseDatabase.getInstance().getReference().child("Review Questions");
if(total >4) {
description.setText("Completed");
details();
}
else
{
int n = rand.nextInt(9);
int n2 = n +1;
//if the number has been selected, so add the selected items to a list.
DatabaseReference databaseref = FirebaseDatabase.getInstance().getReference().child("Questions").child("Plastic").child(String.valueOf(n2));
databaseref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
final Question question = dataSnapshot.getValue(Question.class);
t1_question.setText(Objects.requireNonNull(question).getQuestion());
b1.setText(question.getAnswer1());
b2.setText(question.getAnswer2());
b3.setText(question.getAnswer3());
b4.setText(question.getAnswerCorrect());
这是我的原始代码,我有一个主意,如果我将所有问题都添加到数组列表中,那么每次问一个问题时,我都可以从数组中删除该问题。
我已经尝试过这种方式:
DatabaseReference databaseref = FirebaseDatabase.getInstance().getReference().child("Questions").child("Plastic");
databaseref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
question= dataSnapshot.getValue(Question.class);
list.add(new Question(question.getQuestion(),question.getDifficulty(), question.getAnswer1(),question.getAnswer2(), question.getAnswer3(), question.getAnswerCorrect(),question.getCategory(),question.getId() ,question.getDescription(), question.getScore()));
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
x = list.size();
n = rand.nextInt(x);
if(total >4) {
description.setText("Completed");
details();
}
else
{
//declare as a global variable, in the class then access
question = list.get(n);
t1_question.setText(question.getQuestion());
b1.setText(question.getAnswer1());
b2.setText(question.getAnswer2());
b3.setText(question.getAnswer3());
b4.setText(question.getAnswerCorrect());
出于某种原因,这些问题不会添加到我的数组中,我似乎无法理解为什么。为此会有更好的解决方案吗?
databaseref.addValueEventListener
是异步的,并在查询完成之前立即返回。当数据可用时,您提供给它的回调将在一段时间后调用。您的代码继续假定list
包含一些数据,而实际上还没有。相反,您只需要在调用回调后使用list
的内容即可。因此,您需要将后续代码放入回调本身中,或进行其他操作以确保仅在填充list
之后才调用它。