Я предлагаю создать новый класс 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);
}
}
Для этой операции я изменил ваши четыре ответа TextViews на 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++;
Это моя основная идея. Код - это полная мысль, поэтому она будет компилироваться. Конечно, вы захотите добавить «следующую» кнопку, чтобы увидеть разные вопросы. Но этого достаточно, чтобы вы могли увидеть один из способов рандомизировать свои вопросы и ответы, сохранив их организованность.
Я добавил код, не могли бы вы подробнее о том, как сохранить выбор пользователя, если текстовые поля заполнены случайным образом? – CoffeeCrisp
Сделайте класс QuestionAndAnswer, который содержит правильный ответ на вопрос, но у вас есть статический список «distractors», который будет использоваться для всех ваших объектов QuestionAndAnswer. Кроме того, есть переменная, называемая usersChoice, чтобы сохранить ответ, который пользователь фактически выбрал. Вы можете найти ту, которая была фактически выбрана путем реализации OnClickListener в вашем классе QuestionAndAnswer и для выполнения каждого из ваших тестовых тестов textView.setOnClickListener (это). – ComputerEngineer88
questionTextView.setText (qna.question); in fillInQuestion() функция throw nullpointer исключение из-за объекта questionTextView, установленного в null в questionTextView = (TextView) findViewById (R.id.question); можете ли вы объяснить, почему? – avinesh