我正在尝试在radiogroup
中添加一个radiobuttons
和4个recyclerview
。我将状态保存在room
中,并将其放入适配器以设置适当的单选按钮。在执行此操作时,我在radiogroup.check()
内使用radiogroup.clearchek()
和onBindViewHolder
方法,每当滚动recyclerview时,它将自动调用radiogroup.setOnCheckedChangeListener
。我的代码是这样的
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
question = quesions[position]
qTitle = question.question!!
holder.textTestQuestion.text = "" + (number + position) + " " + question.question;
holder.answerFirst.text = "a. " + question.answers?.get(0).toString()
holder.answerSecond.text = "b. " + question.answers?.get(1).toString()
holder.answerThird.text = "c. " + question.answers?.get(2).toString()
holder.answerFourth.text = "d. " + question.answers?.get(3).toString()
holder.radio_group.setTag(position)
if (question.rightAnswer != null) {
holder.radio_group.check(question.rightAnswer!!)
} else {
holder.radio_group.clearCheck()
}
holder.radio_group.setOnCheckedChangeListener(object : RadioGroup.OnCheckedChangeListener {
override fun onCheckedChanged(group: RadioGroup?, checkedId: Int) {
val pos = group?.getTag() as Int
val ques = quesions[pos]
val chid = group.checkedRadioButtonId
ques.rightAnswer = checkedId
ques.answered = true
Observable.just(question).subscribeOn(Schedulers.io()).subscribe { t: Question? ->
qnADao.saveQuestion(ques)
}
}
})
}
我在这里尝试过所有关于stackoverflow的解决方案,例如在radiogroup.checkedRadioButtonId
中检查-1,然后在radiogroup.isPressed
中也无济于事。因此,任何帮助将不胜感激。谢谢
答案 0 :(得分:0)
使用onClickListener
代替setOnCheckedChangeListener
是一种解决方案。但是,如果将来您在view.performClick()
内进行bind()
,那么这种情况将再次发生。
即使在视图离开屏幕并循环回到新行之后,您设置为视图的侦听器仍然处于活动状态。
向上滚动时,RecyclerView会拍摄离开屏幕的视图,并将其附加到最底行,然后交给您以将其与新数据绑定。此视图仍然具有附加的事件侦听器。当您呼叫holder.radio_group.check()
行时,将执行先前连接的侦听器。
您可以先删除侦听器,然后选中/取消选中无线电组,然后将新的事件侦听器设置为无线电组。在您的代码中,如下所示:
holder.radio_group.setOnCheckedChangeListener(null) // <----- This line added.
if(question.rightAnswer != null) {
holder.radio_group.check(question.rightAnswer!!)
} else {
holder.radio_group.clearCheck()
}
holder.radio_group.setOnCheckedChangeListener(object : RadioGroup.OnCheckedChangeListener { ..... })