Как обработать onCheckedChangeListener в RadioGroup внутри Recyclerview, который вызывается при установке состояния RadioGroup? - PullRequest
0 голосов
/ 12 января 2019

Я пытаюсь добавить radiogroup с 4 radiobuttons в recyclerview. Я сохраняю состояние в room и беру в адаптере для установки соответствующей кнопки. При этом я использую radiogroup.check() и radiogroup.clearchek() метод внутри onBindViewHolder, и тогда он будет автоматически вызывать 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)

                        }

            }

        })

    }

Я перепробовал каждое решение здесь на стеке, например, проверку -1 в radiogroup.checkedRadioButtonId, а затем radiogroup.isPressed у меня ничего не работает. Так что любая помощь будет оценена. Спасибо

1 Ответ

0 голосов
/ 12 января 2019

Использование 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 { ..... })
...