Para hacer que ViewHolder trate cada botón de opción por separado y no reutilice el estado del botón de opción anterior, almacené el estado de si un elemento de botón de opción está marcado o no en una lista de valores booleanos y configuré el estado de los botones de opción de acuerdo con esa lista. pero cuando me desplazo hacia abajo y hacia arriba, los botones de opción alternados se deshabilitan aleatoriamente a pesar de que isCheckedList contiene la información booleana correcta para cada botón de opción (imprimo la lista con logd() para verificar si realmente almacena los estados)
¿Alguna idea de lo que me estoy perdiendo?
class QuestionAdapter(context: Context) : RecyclerView.Adapter<QuestionAdapter.QuestionViewHolder>() { private val listOfQuestion: List<String> private val listSize = 20 private val isCheckedList: MutableList<Boolean> = MutableList(listSize) { false } //Initialize a list of 20 questions. init { val allQuestions = context.resources.getStringArray(R.array.questions).toList() listOfQuestion = allQuestions .shuffled() .take(listSize) } class QuestionViewHolder(val view: View) : RecyclerView.ViewHolder(view) { val questionText = view.findViewById<TextView>(R.id.question) val radioButton = view.findViewById<RadioButton>(R.id.yes) } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): QuestionViewHolder { val layout = LayoutInflater .from(parent.context) .inflate(R.layout.item_view, parent, false) return QuestionViewHolder(layout) } override fun onBindViewHolder(holder: QuestionViewHolder, position: Int) { val item = listOfQuestion[position] holder.questionText.text = item holder.radioButton.isChecked = isCheckedList[position] holder.radioButton.setOnCheckedChangeListener { _, isChecked -> isCheckedList[holder.adapterPosition] = isChecked Log.d("Adapter", "list: $isCheckedList ") } } override fun getItemCount(): Int { return listOfQuestion.size } }Debe borrar la selección en el botón de radio antes de establecer su valor correcto.
holder.radioGroup.clearCheck() De esta manera, el grupo de RadioGroup borra su selección, listo para recibir una entrada que activará el botón de radio correcto RadioButton lo marcado.
Pero debe tener en cuenta que esto podría llamar a sus oyentes onCheckedChanged y podría generar resultados inesperados. Pero hay una solución para el problema resultante.
// Nullify listener holder.radioGroup.setOnCheckedChangeListener(null); // Clear selection holder.radioGroup.clearCheck(); // Reset listener after selection has been cleared holder.radioGroup.setOnCheckedChangeListener(checkedChangeListener);