QuestionAndAnswerという新しいクラスを作成することをお勧めします。クラスは質問と正解を保持する必要があります。また、カスタマイズされた間違った答えとユーザーの選択を保持することもできます。正確な実装は完全にあなた次第です。
アクティビティには、このQuestionAndAnswerクラスの配列があり、質問をするリストを循環し、完了したらポイントを集計します。
(あなたが試したことの関連するコードを含めると、より具体的になる可能性があります。)
添加
これが私が始めることです:(
あなたのコードから、あなたdistractorList
が表示したい間違った答えが含まれていると思います。)
public class QuestionAndAnswer {
public List<String> allAnswers; // distractors plus real answer
public String answer;
public String question;
public String selectedAnswer;
public int selectedId = -1;
public QuestionAndAnswer(String question, String answer, List<String> distractors) {
this.question = question;
this.answer = answer;
allAnswers = new ArrayList<String> (distractors);
// Add real answer to false answers and shuffle them around
allAnswers.add(answer);
Collections.shuffle(allAnswers);
}
public boolean isCorrect() {
return answer.equals(selectedAnswer);
}
}
アクティビティでは、4つの回答TextViewをRadioGroupに変更しました。これにより、ユーザーは直感的に回答を選択できます。prev
また、ボタンがあると思いnext
ます、それらは調整int currentQuestion
して呼び出しますfillInQuestion()
。
public class Example extends Activity {
RadioGroup answerRadioGroup;
int currentQuestion = 0;
TextView questionTextView;
List<QuestionAndAnswer> quiz = new ArrayList<QuestionAndAnswer>();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
questionTextView = (TextView) findViewById(R.id.question);
answerRadioGroup = (RadioGroup) findViewById(R.id.answers);
// Setup a listener to save chosen answer
answerRadioGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
if(checkedId > -1) {
QuestionAndAnswer qna = quiz.get(currentQuestion);
qna.selectedAnswer = ((RadioButton) group.findViewById(checkedId)).getText().toString();
qna.selectedId = checkedId;
}
}
});
String[] question = { //questions here// };
String[] answer = { //answers here// };
String[] distractor = { //distractors here// };
ArrayList<String> distractorList = Arrays.asList(distractor);
/* I assumed that there are 3 distractors per question and that they are organized in distractorList like so:
* "q1 distractor 1", "q1 distractor 2", "q1 distractor 3",
* "q2 distractor 1", "q2 distractor 2", "q2 distractor 3",
* etc
*
* If the question is: "The color of the sky", you'd see distractors:
* "red", "green", "violet"
*/
int length = question.length;
for(int i = 0; i < length; i++)
quiz.add(new QuestionAndAnswer(question[i], answer[i], distractorList.subList(i * 3, (i + 1) * 3)));
Collections.shuffle(quiz);
fillInQuestion();
}
public void fillInQuestion() {
QuestionAndAnswer qna = quiz.get(currentQuestion);
questionTextView.setText(qna.question);
// Set all of the answers in the RadioButtons
int count = answerRadioGroup.getChildCount();
for(int i = 0; i < count; i++)
((RadioButton) answerRadioGroup.getChildAt(i)).setText(qna.allAnswers.get(i));
// Restore selected answer if exists otherwise clear previous question's choice
if(qna.selectedId > -1)
answerRadioGroup.check(qna.selectedId);
else
answerRadioGroup.clearCheck();
}
}
QuestionAndAnswerにはisCorrect()メソッドがあることに気付いたかもしれませんが、クイズを採点するときは、次のように正解を数えることができます。
int correct = 0;
for(QuestionAndAnswer question : quiz)
if(question.isCorrect())
correct++;
これが私の一般的な考え方です。コードは完全に考えられているので、コンパイルされます。もちろん、さまざまな質問を表示するには、「次へ」ボタンを追加することをお勧めします。しかし、これは、質問と回答を整理したままランダム化する1つの方法を理解するのに十分です。