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
相关产品推荐
相关产品推荐

