如何处理设置 RadioGroup 状态时调用的 Recyclerview 中 RadioGroup 中的 onCheckedChangeListener?
How to handle onCheckedChangeListener in RadioGroup inside Recyclerview which is called while setting the state of the RadioGroup?
我正在尝试在 recyclerview
中添加一个 radiogroup
和 4 radiobuttons
。我将状态保存在 room
中,并将其放入适配器中以设置适当的单选按钮。在执行此操作时,我在 onBindViewHolder
中使用 radiogroup.check()
和 radiogroup.clearchek()
方法,然后每当我们滚动 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)
}
}
})
}
我已经在 Whosebug 上尝试了所有解决方案,例如检查 radiogroup.checkedRadioButtonId
中的 -1,然后 radiogroup.isPressed
对我来说没有任何效果。所以任何帮助将不胜感激。谢谢
使用 onClickListener
而不是 setOnCheckedChangeListener
是一种解决方案。但是,如果您将来在 bind()
中执行 view.performClick()
,那么这种情况将再次发生。
即使在视图离开屏幕并回收到新行后,您为视图设置的侦听器仍然处于活动状态。
向上滚动时,离开屏幕的视图由 RecyclerView 获取并将其附加到底部行,然后交给您将其与新数据绑定。该视图仍然附加了该事件侦听器。当您调用行 holder.radio_group.check()
时,先前附加的侦听器将执行。
可以先移除监听器,然后check/uncheck radiogroup,然后将新的事件监听器设置到radiogroup。在您的代码中,像这样:
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 { ..... })
我正在尝试在 recyclerview
中添加一个 radiogroup
和 4 radiobuttons
。我将状态保存在 room
中,并将其放入适配器中以设置适当的单选按钮。在执行此操作时,我在 onBindViewHolder
中使用 radiogroup.check()
和 radiogroup.clearchek()
方法,然后每当我们滚动 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)
}
}
})
}
我已经在 Whosebug 上尝试了所有解决方案,例如检查 radiogroup.checkedRadioButtonId
中的 -1,然后 radiogroup.isPressed
对我来说没有任何效果。所以任何帮助将不胜感激。谢谢
使用 onClickListener
而不是 setOnCheckedChangeListener
是一种解决方案。但是,如果您将来在 bind()
中执行 view.performClick()
,那么这种情况将再次发生。
即使在视图离开屏幕并回收到新行后,您为视图设置的侦听器仍然处于活动状态。
向上滚动时,离开屏幕的视图由 RecyclerView 获取并将其附加到底部行,然后交给您将其与新数据绑定。该视图仍然附加了该事件侦听器。当您调用行 holder.radio_group.check()
时,先前附加的侦听器将执行。
可以先移除监听器,然后check/uncheck radiogroup,然后将新的事件监听器设置到radiogroup。在您的代码中,像这样:
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 { ..... })