[英]Dynamically created radio button is disappearing while clicking
我正在獲得所有視圖,但是當我單擊按鈕並向下滾動時,它將被取消選中。 我在 onBindViewHolder 添加了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)
}
})
}
}
}
}
您需要在視圖外部跟蹤已檢查的 state 答案,並在綁定視圖時應用 state。 假設每個列表項的答案都是唯一的字符串,您可以使用 Map 來存儲狀態。
// 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)
}
})
}
}
}
}
如果您的數據可以更改,這將變得更加復雜。 您需要將此 Boolean 存儲在您的實際反饋 class 中,以便在有新數據時可以恢復。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.