问题描述
我有一个选择题,每个答案有4个选择。在具有问题和选择的ArrayList中,将正确答案设置为正确选项的索引。我想打乱选择,但不确定如何确定正确答案的新索引。有什么想法吗?
问题对象
object ConstantsAnalysis {
const val TOTAL_CORRECT: String = "total_correct"
const val TOTAL_OPP: String = "total_opp"
fun getQuestions3(): ArrayList<Questions3> {
val questionList = ArrayList<Questions3>()
val q1 = Questions3(1,null,"On a graph,the horizontal line along which data are plotted is the _____","y axis","x axis","origin","quadrant",2,R.string.Jones_1995,null)
questionList.addAll(listof(q1))
questionList.shuffle()
return questionList
}
}
数据类
data class Questions3(
val id: Int,val image: Int?,val question: String,val option1: String,val option2: String,val option3: String,val option4: String,val correctAnswer: Int,val dialogBox: Int?,val dialogBox2: Int?)
随机选择
val ansorder = arrayOf(question.option1,question.option2,question.option3,question.option4)
ansorder.shuffle()
radio_button1.text = ansorder[0]
radio_button2.text = ansorder[1]
radio_button3.text = ansorder[2]
radio_button4.text = ansorder[3]
检查答案选择
if (questions3!!.correctAnswer != mSelectedOptionPosition) {
//do x
}
编辑(由于correct answer
是一个字符串,并且在改组answerView(questions3.correctAnswer,R.drawable.correct_option_border
之后,索引会更改。
class QuestionsActivityAnalysis : AppCompatActivity(),View.OnClickListener {
private var mCurrentPosition:Int = 1
private var mQuestionsList:ArrayList<Questions3>? = null
private var mSelectedOptionPosition:Int = 0
private var mCorrectAnswers: Int = 0
private var mSelectedOptionText: String? = null
private fun shuffle() {
val question = mQuestionsList!![mCurrentPosition - 1]
val ansorder = arrayOf(question.option1,question.option4)
ansorder.shuffle()
radio_button1.text = ansorder[0]
radio_button2.text = ansorder[1]
radio_button3.text = ansorder[2]
radio_button4.text = ansorder[3]
}
override fun onClick(v: View?) {
when(v?.id){
R.id.radio_button1 -> { selectedOptionView(radio_button1,1)
mSelectedOptionText = radio_button1.text as String?
}
R.id.radio_button2 -> { selectedOptionView(radio_button2,2)
mSelectedOptionText = radio_button2.text as String?
}
R.id.radio_button3 -> { selectedOptionView(radio_button3,3)
mSelectedOptionText = radio_button3.text as String?
}
R.id.radio_button4 -> { selectedOptionView(radio_button4,4)
mSelectedOptionText = radio_button4.text as String?
}
R.id.btn_submit -> {
val questions3 = mQuestionsList?.get(mCurrentPosition - 1)
if (questions3!!.correctAnswer != mSelectedOptionText) {
} else {
mCorrectAnswers++
}
answerView(questions3.correctAnswer,R.drawable.correct_option_border)
private fun answerView(answer: Int,drawableView: Int) {
when(answer){
1 -> {
radio_button1.background = ContextCompat.getDrawable(this,drawableView)
}
2 -> {
radio_button2.background = ContextCompat.getDrawable(this,drawableView)
}
3 -> {
radio_button3.background = ContextCompat.getDrawable(this,drawableView)
}
4 -> {
radio_button4.background = ContextCompat.getDrawable(this,drawableView)
}
}
}
解决方法
我真的建议仅创建一个像这样的数据类:
data class QuestionOption(val question:String,val isCorrect = false)
之后,您可以按照自己喜欢的任何方式进行随机播放,只需检查所选的QuestionOption是否将isCorrect设置为true。您会获得很多好处,逻辑也会变得更简单。
编辑:
为了更轻松地以这种方式声明问题:
通常,如果您在代码中添加问题,则只需要所需的必要代码。为此,您可以声明一个好的构造函数,也可以是一个将您的值基本上映射到构造函数的函数。就您而言,我会说
data class Questions3(
val id: Int,val question: String,val option1: String,val option2: String,val option3: String,val correctOption: String,val image: Int?=null,val dialogBox1: Int?=null,val dialogBox2: Int?=null)
(请注意可选参数的最后位置,由于默认情况下它们为null,因此您也无需指定它们)
从某种意义上说,从理论上讲,您也可以(不是太干净,但很容易)只是将选项1-3和correctOption混洗,然后比较是否正确的Option String与选定的String相匹配。
否则,正如我所说,您始终可以创建用于映射内容的逻辑。在这里,您可以从构造函数映射到另一个构造函数,就像返回返回完成对象的函数一样。