java - 如何从中获取随机测验问题并在测验问题结束时添加听众

标签 java android firebase firebase-realtime-database

<分区>

我是一名教师,为我的学生休息创建了一个测验,我的 firebase 实时数据库中有 500 个问题 我想做的就是 随机化问题,每次50个问题设置一个监听器在50个问题之后显示结果

这是我的测验 Activity

public class grandtest extends AppCompatActivity {

TextView mQuestionTextView;
ProgressBar mProgressBar;
Button bchoice1,bchoice2,bchoice3,bchoice4;
Random Rand;
String mAnswer;
Timer mTimer;
TextView mScoreTextView;
public static int mScore;
int mQuestionNo = 0;

private Firebase mQuestionRef;
private Firebase mChoice1Ref;
private Firebase mChoice2Ref;
private Firebase mChoice3Ref;
private Firebase mChoice4Ref;
private Firebase mAnswerRef;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_grandtest);

    mQuestionTextView = findViewById(R.id.mquestiontextview);
    mProgressBar = findViewById(R.id.progressBar);
    bchoice1 = findViewById(R.id.choice1);
    bchoice2 = findViewById(R.id.choice2);
    bchoice3 = findViewById(R.id.choice3);
    bchoice4 = findViewById(R.id.choice4);
    mScoreTextView = findViewById(R.id.mScore);
}


public void updateQuestion (){

    mQuestionRef = new Firebase("https://class9notes-2808b.firebaseio.com/"+mQuestionNo +"/question");
    mQuestionRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
        String question = dataSnapshot.getValue(String.class);
        mQuestionTextView.setText(question);
        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {
            Toast.makeText(grandtest.this,"Please enable data",Toast.LENGTH_SHORT).show();
        }
    });
    mChoice1Ref = new Firebase("https://class9notes-2808b.firebaseio.com/"+mQuestionNo+"/choice1");
    mChoice1Ref.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            String choice1 = dataSnapshot.getValue(String.class);
            bchoice1.setText(choice1);
        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {

        }
    });
    mChoice2Ref = new Firebase("https://class9notes-2808b.firebaseio.com/"+mQuestionNo+"/choice2");
    mChoice2Ref.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            String choice2 = dataSnapshot.getValue(String.class);
            bchoice2.setText(choice2);
        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {

        }
    });
    mChoice3Ref = new Firebase("https://class9notes-2808b.firebaseio.com/"+mQuestionNo+"/choice3");
    mChoice3Ref.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            String choice3 = dataSnapshot.getValue(String.class);
            bchoice3.setText(choice3);
        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {

        }
    });
    mChoice4Ref = new Firebase("https://class9notes-2808b.firebaseio.com/"+mQuestionNo+"/choice4");
    mChoice4Ref.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            String choice4 = dataSnapshot.getValue(String.class);
            bchoice4.setText(choice4);
        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {

        }
    });
    mAnswerRef = new Firebase("https://class9notes-2808b.firebaseio.com/"+mQuestionNo+"/answer");
    mAnswerRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            mAnswer = (String) dataSnapshot.getValue(String.class);
        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {

        }
    });
    mQuestionNo ++;

我想随机化 mQuestionNo 对象以每次检索随机问题。 这是我的 firebase 数据的结构

Firebase Data

最佳答案

这不会解决您的问题,但会帮助您走上更好的编码之路! :)

创建一个类来包含你的问题

public class Question {

    String question;
    String choice1;
    String choice2;
    String choice3;
    String choice4;
    String answer;
}

然后在您的 Activity 中您可以只调用一个 databaseReference 而不是多个。

    int questionNo = 0;

    mDatabase.child(String.valueOf(questionNo)).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            Question question = new Question();
            question.answer = dataSnapshot.child("answer").getValue().toString();
            question.choice1 = dataSnapshot.child("choice1").getValue().toString();
            question.choice2 = dataSnapshot.child("choice2").getValue().toString();
            question.choice3 = dataSnapshot.child("choice3").getValue().toString();
            question.choice4 = dataSnapshot.child("choice4").getValue().toString();
            question.question = dataSnapshot.child("question").getValue().toString();
        }

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

        }
    });

这里我们在 0 索引处获取问题。

您可以获得 50 个这样的随 secret 钥:

    ArrayList<Integer> questions = new ArrayList<>();

    while(questions.size() < 50){
        int random = new Random().nextInt(500 + 1)  + 1;
        if (!questions.contains(random)){
            questions.add(random);
            //Question added
        }else{
            //Question already added to list
        }
    }

现在您有了要遍历的问题的键。然后你可以调用 questions.get(49) 来获取所有键中的最后一个问题,用这个索引检查你的 firebase,当 firebase 得到问题时,你可以用问题 questions.remove(49) 删除这个索引;并转到下一个索引。当然,49 不应该被硬编码,而是您设置为 int questionCount = 49 的值;然后当你完成所有这些后你会 --questionCount;

现在这有点伪,但希望它能给你一些想法:)

关于java - 如何从中获取随机测验问题并在测验问题结束时添加听众,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53043249/

相关文章:

java - 嵌套 Case 语句时的 Sonar 问题

java - Android 应用程序在没有 WiFi 连接的情况下无法运行

java - Android中一些方法之间加括号是什么意思?

android - 使用android WiFi API查找我手机范围内的路由器信息

javascript - 将文件存储在 Firebase 存储中

javascript - Firebase orderByChild 未获得结果

JavaFx 在 Pane 中创建场景

java.lang.OutOfMemory错误: Java heap space

android - 是否有任何 Android 电子邮件应用程序可以转发传入电子邮件的 Intent ?

firebase - 如何从 Firebase 控制台中删除 Google 项目?