如何处理在设置RadioGroup状态时调用的Recyclerview中RadioGroup中的onCheckedChangeListener?

时间:2019-01-12 16:01:42

标签: android kotlin android-radiobutton android-radiogroup

我正在尝试在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中也无济于事。因此,任何帮助将不胜感激。谢谢

1 个答案:

答案 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 { ..... })