You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio无数据库Quiz App实现无重复随机出题咨询

实现Android测验应用的无重复随机题目功能

核心思路

不用改动原有的题目、选项、答案数组,而是创建一个题目索引列表,把所有题目的索引(0、1、2...)存入列表,用Collections.shuffle()打乱这个列表的顺序。之后按打乱后的索引加载题目,就能保证题目不重复且随机展示。

具体修改步骤

1. 导入必要工具包

在MainActivity.java顶部添加Collections的导入语句:

import java.util.ArrayList;
import java.util.Collections;

2. 调整MainActivity的变量

替换原有索引变量,新增保存打乱后索引的列表:

int score = 0;
// 新增:存放打乱后的题目索引
ArrayList<Integer> shuffledQuestionIndices;
// 替换原currentQuestionIndex,记录当前遍历的索引位置
int currentQuestionPosition = 0;
String selectedAnswer = "";

3. 初始化并打乱索引列表

在onCreate方法中,loadNewQuestion()执行前,初始化索引列表并打乱:

// 把0到题目总数的索引添加到列表
shuffledQuestionIndices = new ArrayList<>();
for (int i = 0; i < QuestionAnswer.question.length; i++) {
    shuffledQuestionIndices.add(i);
}
// 打乱索引顺序
Collections.shuffle(shuffledQuestionIndices);

totalQuestionsTextView.setText("Total Questions : " + shuffledQuestionIndices.size());

loadNewQuestion();

4. 修改题目加载逻辑

更新loadNewQuestion方法,按打乱后的索引获取题目内容:

void loadNewQuestion(){
    if(currentQuestionPosition == shuffledQuestionIndices.size()){
        finishQuiz();
        return;
    }
    // 获取当前题目的原始索引
    int originalIndex = shuffledQuestionIndices.get(currentQuestionPosition);
    
    questionTextView.setText(QuestionAnswer.question[originalIndex]);
    ansA.setText(QuestionAnswer.choices[originalIndex][0]);
    ansB.setText(QuestionAnswer.choices[originalIndex][1]);
    ansC.setText(QuestionAnswer.choices[originalIndex][2]);
    ansD.setText(QuestionAnswer.choices[originalIndex][3]);
}

5. 修复提交按钮逻辑(补上答案判断)

原代码漏了答案正确性判断,同时更新索引位置:

if(clickedButton.getId()==R.id.submbit_btn){
    // 获取当前题目的原始索引,判断答案是否正确
    int originalIndex = shuffledQuestionIndices.get(currentQuestionPosition);
    if(selectedAnswer.equals(QuestionAnswer.correctAnswers[originalIndex])){
        score++;
    }
    currentQuestionPosition++;
    loadNewQuestion();
}

6. 重启测验时重新打乱索引

修改restartQuiz方法,保证每次重启都是新的随机顺序:

void restartQuiz(){
    score = 0;
    currentQuestionPosition = 0;
    // 重新打乱索引列表
    Collections.shuffle(shuffledQuestionIndices);
    loadNewQuestion();
}

7. 更新测验结束的统计文本

把finishQuiz里的题目总数替换为打乱列表的长度:

.setMessage("Score is "+score+" out of "+ shuffledQuestionIndices.size())

完整修改后的MainActivity关键代码

import androidx.appcompat.app.AppCompatActivity;
import android.app.AlertDialog;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.Collections;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    TextView totalQuestionsTextView;
    TextView questionTextView;
    Button ansA,ansB,ansC,ansD;
    Button submitBtn;

    int score=0;
    ArrayList<Integer> shuffledQuestionIndices;
    int currentQuestionPosition = 0;
    String selectedAnswer = "";

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

        totalQuestionsTextView = findViewById(R.id.total_questions);
        questionTextView = findViewById(R.id.question);
        ansA = findViewById(R.id.ans_A);
        ansB = findViewById(R.id.ans_B);
        ansC = findViewById(R.id.ans_C);
        ansD = findViewById(R.id.ans_D);
        submitBtn = findViewById(R.id.submbit_btn);

        ansA.setOnClickListener(this);
        ansB.setOnClickListener(this);
        ansC.setOnClickListener(this);
        ansD.setOnClickListener(this);
        submitBtn.setOnClickListener(this);

        shuffledQuestionIndices = new ArrayList<>();
        for (int i = 0; i < QuestionAnswer.question.length; i++) {
            shuffledQuestionIndices.add(i);
        }
        Collections.shuffle(shuffledQuestionIndices);

        totalQuestionsTextView.setText("Total Questions : " + shuffledQuestionIndices.size());

        loadNewQuestion();
    }

    @Override
    public void onClick(View view) {
        ansA.setBackgroundColor(Color.WHITE);
        ansB.setBackgroundColor(Color.WHITE);
        ansC.setBackgroundColor(Color.WHITE);
        ansD.setBackgroundColor(Color.WHITE);

        Button clickedButton = (Button) view;
        if(clickedButton.getId()==R.id.submbit_btn){
            int originalIndex = shuffledQuestionIndices.get(currentQuestionPosition);
            if(selectedAnswer.equals(QuestionAnswer.correctAnswers[originalIndex])){
                score++;
            }
            currentQuestionPosition++;
            loadNewQuestion();
        }else{
            selectedAnswer = clickedButton.getText().toString();
            clickedButton.setBackgroundColor(Color.MAGENTA);
        }
    }

    void loadNewQuestion(){
        if(currentQuestionPosition == shuffledQuestionIndices.size()){
            finishQuiz();
            return;
        }
        int originalIndex = shuffledQuestionIndices.get(currentQuestionPosition);
        questionTextView.setText(QuestionAnswer.question[originalIndex]);
        ansA.setText(QuestionAnswer.choices[originalIndex][0]);
        ansB.setText(QuestionAnswer.choices[originalIndex][1]);
        ansC.setText(QuestionAnswer.choices[originalIndex][2]);
        ansD.setText(QuestionAnswer.choices[originalIndex][3]);
    }

    void finishQuiz(){
        String passStatus = "";
        if (score > shuffledQuestionIndices.size()*0.60){
            passStatus = "Passes";
        }else{
            passStatus = "Failed";
        }
        new AlertDialog.Builder(this)
                .setTitle(passStatus)
                .setMessage("Score is "+score+" out of "+ shuffledQuestionIndices.size())
                .setPositiveButton("Restart",(dialogInterface, i) -> restartQuiz())
                .setCancelable(false)
                .show();
    }

    void restartQuiz(){
        score = 0;
        currentQuestionPosition = 0;
        Collections.shuffle(shuffledQuestionIndices);
        loadNewQuestion();
    }
}

内容的提问来源于stack exchange,提问作者Hậu Đặng Văn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 12:55:16