滚动 recyclerview 时突然取消选中所有单选按钮 (android kotlin)
all radio button suddenly unchecked when the recyclerview was scrolled (android kotlin)
我在 recyclerview 的每一行内制作了动态单选按钮列表,但是当我随机滚动所有单选按钮时,我使用模型来存储单选按钮条件,notifyItemChanged,首先初始化检查,使用布局而不是 radiogroup,并使用选择条件来检查特殊的单选按钮,但我无法解决这个问题
下面第一张图片所有单选按钮都被勾选
但是向下滚动和向上滚动时所有单选按钮都未选中
这是我在 recyclerview 中的项目布局
<?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
注意: 我的单选按钮是动态的,所以不仅有 2 个选项,还有更多选项,具体取决于我从 API
中获取的数据
几个小时后解决,我终于明白是什么原因导致 problem.i 总是调用 InputFieldHolder.radiogroup?.removeAllViews()
销毁所有单选按钮并用新的 satet 制作新的单选按钮,但单选组总是保存以前单选按钮的状态销毁 所以最后我只是在销毁单选按钮后调用 InputFieldHolder.radiogroup?.clearCheck()
以清除单选组内的所有检查状态
我在 recyclerview 的每一行内制作了动态单选按钮列表,但是当我随机滚动所有单选按钮时,我使用模型来存储单选按钮条件,notifyItemChanged,首先初始化检查,使用布局而不是 radiogroup,并使用选择条件来检查特殊的单选按钮,但我无法解决这个问题
下面第一张图片所有单选按钮都被勾选
但是向下滚动和向上滚动时所有单选按钮都未选中
这是我在 recyclerview 中的项目布局
<?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
注意: 我的单选按钮是动态的,所以不仅有 2 个选项,还有更多选项,具体取决于我从 API
中获取的数据几个小时后解决,我终于明白是什么原因导致 problem.i 总是调用 InputFieldHolder.radiogroup?.removeAllViews()
销毁所有单选按钮并用新的 satet 制作新的单选按钮,但单选组总是保存以前单选按钮的状态销毁 所以最后我只是在销毁单选按钮后调用 InputFieldHolder.radiogroup?.clearCheck()
以清除单选组内的所有检查状态