使用Firebase使用随机生成的问题创建测验

问题描述 投票:0回答:1

[我正在尝试使用我的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());

出于某种原因,这些问题不会添加到我的数组中,我似乎无法理解为什么。为此会有更好的解决方案吗?

java android firebase arraylist firebase-realtime-database
1个回答
0
投票

databaseref.addValueEventListener是异步的,并在查询完成之前立即返回。当数据可用时,您提供给它的回调将在一段时间后调用。您的代码继续假定list包含一些数据,而实际上还没有。相反,您只需要在调用回调后使用list的内容即可。因此,您需要将后续代码放入回调本身中,或进行其他操作以确保仅在填充list之后才调用它。

© www.soinside.com 2019 - 2024. All rights reserved.