Динамически созданная радиокнопка исчезает при нажатии - PullRequest
0 голосов
/ 06 мая 2020

Я получаю все просмотры, но когда я нажимаю кнопку и прокручиваю вниз, это не будет отмечено. Я добавил представления removeall для файла onBindViewHolder. потому что радиокнопки генерируются бесконечное количество раз. Здесь я поделился кодом, пожалуйста, проверьте его.

override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
    holder.radioGrp.setOrientation(RadioGroup.VERTICAL)
    holder.radioGrp.removeAllViews()
    holder.bindView(position)
}

inner class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
    val radioGrp = itemView.findViewById<RadioGroup>(R.id.radio_group)

    fun bindView(position: Int) {
        itemView.tv_question.text = feedback[position].questions
        var newAnswer = feedback[position].answser as ArrayList<String>

        if (newAnswer.isEmpty()) {
            itemView.linear2.visibility = View.VISIBLE
        } else {
            newAnswer.forEach {
                itemView.linear2.visibility = View.GONE
                val rb = RadioButton(context)
                rb.text = it
                rb.id = position
                radioGrp.addView(rb)

                rb?.setOnCheckedChangeListener(CompoundButton.OnCheckedChangeListener { 
                  buttonView, isChecked ->
                    if (isChecked) {
                        rb.isChecked = true
                        examinationListener.addAnswer(names)
                    } else {
                        rb.isChecked = false
                        examinationListener.removeAnswer(names as String)
                    }
                })
            }
        }
    }
}

1 Ответ

0 голосов
/ 06 мая 2020

Вам необходимо отслеживать отмеченное состояние ваших ответов извне для представлений и применять состояние при привязке представлений. Предполагая, что все ответы для каждого элемента списка являются уникальными строками, вы можете использовать карту для хранения состояний.

// In your adapter:
val answerStates = mutableMapOf<Int, MutableMap<String, Boolean>>()

inner class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
    val radioGrp = itemView.findViewById<RadioGroup>(R.id.radio_group)

    fun bindView(position: Int) {
        itemView.tv_question.text = feedback[position].questions
        val newAnswer = feedback[position].answser as ArrayList<String>


        if (newAnswer.isEmpty()) {
            itemView.linear2.visibility = View.VISIBLE
        } else {
            itemView.linear2.visibility = View.GONE

            // Lazily create answer states map for this list item
            val answerStates = answerStates[position] 
                ?: mutableMapOf<String, Boolean>().also { answerStates[position] = this }

            newAnswer.forEach {
                val rb = RadioButton(context)
                rb.text = it
                rb.id = position
                rb.checked = answerStates[it] ?: false // Bind last known state, default false
                radioGrp.addView(rb)

                rb?.setOnCheckedChangeListener(CompoundButton.OnCheckedChangeListener { 
                  buttonView, isChecked ->
                    answerStates[it] = isChecked // Save state
                    if (isChecked) {
                        rb.isChecked = true
                        examinationListener.addAnswer(names)
                    } else {
                        rb.isChecked = false
                        examinationListener.removeAnswer(names as String)
                    }
                })
            }
        }
    }
}

Если ваши данные могут изменяться, это усложняется. Вам нужно будет сохранить это логическое значение в вашем фактическом классе Feedback, чтобы его можно было восстановить при наличии fre sh данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...