簡體   English   中英

單擊時動態創建的單選按鈕消失

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM