如何处理设置 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 { ..... })