【问题标题】:how to get random quiz question from and add listener on end of questions in quiz [duplicate]如何从中获取随机测验问题并在测验中的问题结束时添加听众[重复]
【发布时间】:2018-10-29 19:37:57
【问题描述】:

我是一名教师,为我的学生创建测验休息已完成我的 Firebase 实时数据库中有 500 个问题 我想做的只是 随机化问题,每次50个问题并设置一个听众在50个问题后显示结果

这是我的测验活动

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 数据的结构

【问题讨论】:

  • 创建一个类来处理您的对象可能是个好主意。您可以调用一个,而不是调用 6 个 firebase 引用,然后将您获得的数据转换回一个可以保存值的自定义对象。

标签: java android firebase firebase-realtime-database


【解决方案1】:

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

创建一个包含您的问题的类

public class Question {

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

然后在您的活动中,您可以只调用一个 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 个随机密钥:

    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 收到问题时,您可以使用 question questions.remove(49) 删除此索引;并转到下一个索引。当然 49 不应该是硬编码的,而是你设置为 int questionCount = 49; 的值。然后当你完成所有这些后,你会 --questionCount;

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

【讨论】:

    【解决方案2】:
    • 创建一个包含所有问题的键值的 ArrayList
    • 然后从arraylist中选择一个随机键,从firebase中选择数据后,从arrayList中删除该键,将计数器递增并重复此步骤,直到计数器达到50
    • 计数器达到 50 后显示结果

    【讨论】:

    • 你能写得务实吗?
    • 步骤太多了,上面的逻辑对你有用,搜索如何向arraylist添加值,如何从arraylist中获取随机项目,如何从arraylist中删除项目
    【解决方案3】:

    您可以创建一个Set来存储以前的问题,并使用以下方法可以检索下一个问题的编号。

    Set<Integer> set = new HashSet<>();
    
    public int getNextQuestionNumber() {
        int num = (int) (Math.random() * 500); //Total number of questions in the database.
        if (set.contains(num)) {
            return getNextQuestionNumber();
        } else {
            set.add(num);
            return num;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多