все переключатели внезапно отключаются при прокрутке окна просмотра (android kotlin) - PullRequest
0 голосов
/ 13 марта 2020

я делаю динамический c список радиокнопок внутри каждой строки в представлении реселлера, но когда я случайным образом прокручиваю все радиокнопки, не отмеченные, я использую модель для сохранения состояния радиокнопки, notifyItemChanged, инициализирую первый чек, используя макет вместо радиогруппы, и использую условие выбора для установите флажок spesifi c, но я не могу решить эту проблему

после первого снимка все переключатели отмечены

enter image description here

, но при прокрутке вниз и назад все радиокнопки не проверяются

enter image description here

это макет моего элемента в обзоре переработчика

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/linearLayoutlayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="10dp">

    <TableRow
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:weightSum="2">

        <LinearLayout

            android:layout_height="wrap_content"
            android:layout_margin="10dp"
            android:layout_weight="1"
            android:orientation="vertical">

            <TextView
                android:id="@+id/questionText"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="Sumber Data" />

        </LinearLayout>

        <LinearLayout

            android:layout_height="wrap_content"
            android:layout_margin="10dp"
            android:layout_weight="1"
            android:orientation="vertical">

            <CheckBox
                android:id="@+id/tidak_ada"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="Tidak Ada" />


        </LinearLayout>

    </TableRow>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:weightSum="2">

        <RadioGroup
            android:id="@+id/radiogroup"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:orientation="vertical"/>

        <LinearLayout
            android:id="@+id/layout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:orientation="vertical"></LinearLayout>

    </LinearLayout>


</LinearLayout>

мой код для создания радиокнопки внутри адаптера в onBindViewHolder

var rprms = InputFieldHolder.radiogroup?.layoutParams
        if(rprms != null && question.pilihan_jawabans.count() > 0){
            InputFieldHolder.radiogroup?.removeAllViews()
            question.pilihan_jawabans.forEachIndexed {i,e->
                val rdbtn = RadioButton(context)
                rdbtn.id = question.pilihan_jawabans[i].id
                rdbtn.text = question.pilihan_jawabans[i].isi.toString()
                rprms = RadioGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)
                InputFieldHolder.radiogroup?.addView(rdbtn, rprms)

                val size = InputFieldHolder.radiogroup?.childCount?.minus(1)

                if(question.pilihan_jawabans[i].checked){
                    for (x in 0..size!!) {
                        if((InputFieldHolder.radiogroup?.getChildAt(x) is RadioButton)){
                            if((InputFieldHolder.radiogroup?.getChildAt(x) as RadioButton).id != question.pilihan_jawabans[i].id){
                                (InputFieldHolder.radiogroup?.getChildAt(x) as RadioButton).setChecked(false)
                            }
                        }
                    }
                }

                rdbtn.setChecked(question.pilihan_jawabans[i].checked)
                rdbtn.setTag(Integer(question.pilihan_jawabans[i].id))

                rdbtn.setOnCheckedChangeListener({ group, checked ->
                    question.pilihan_jawabans.forEachIndexed {ii,ee->
                        if(checked){
                            question.pilihan_jawabans[ii].checked = false
                        }
                    }
                    question.pilihan_jawabans[i].checked = checked
                    notifyItemChanged(position)
                })
            }


        }

моя модель для хранения проверенного радиокнопки состояния

@Parcelize
class QuestionSelection(
    var id : Int,
    var isi : String,
    var keterangan : String,
    var checked : Boolean = false

) : Parcelable

ПРИМЕЧАНИЕ: моя радио-кнопка - динамическая c, поэтому не просто 2 варианта, а больше, в зависимости от данных, которые я взял из API

1 Ответ

0 голосов
/ 13 марта 2020

после нескольких часов решения, я, наконец, понял причину проблемы. Я всегда звоню InputFieldHolder.radiogroup?.removeAllViews(), чтобы уничтожить всю радиокнопку и создать новую с новым спутником, но радиогруппа всегда сохраняет состояние из предыдущей радиопереключателя, поэтому в прошлом я просто вызовите InputFieldHolder.radiogroup?.clearCheck() после уничтожения радио-кнопки, чтобы очистить все состояния проверки внутри группы радио

...