我正在努力:
在我的片段中获取选中的复选框项
我所尝试的
所以,我知道有2种方法保存状态的复选框,而滚动在回收视图
我选择了选项1。
模特-Sings. kt
data class Songs(
val songId: Int? = null,
)
适配器-SelectSong Adapter. kt
//In OnBindViewHolder -
binding.checkbox.isChecked = checkBoxStateArray.get(position,
false)
//function to get all checked songs
fun getSelectedIds(): SparseBooleanArray {
return checkBoxStateArray
}
//In adapter viewHolder
checkbox.setOnClickListener {
if (!checkBoxStateArray.get(bindingAdapterPosition, false)).
{//checkbox checked
checkbox.isChecked = true
//stores checkbox states and position
checkBoxStateArray.put(bindingAdapterPosition, true)
} else {//checkbox unchecked
checkbox.isChecked = false
//stores checkbox states and position.
checkBoxStateArray.put(bindingAdapterPosition, false)
}
}
片段-选择歌曲片段. kt
//get selected items - this returns an empty list, even when some
items are checked
val selectedRows = selectSongsAdapter.getSelectedIds()
Log.e("selectedSongs", selectedRows.toString())
问题
如何从适配器到片段获取选定的项目。我的代码返回一个空列表。
我想从适配器中获取任何选中/选定的项目到我的片段(观察变化)
您不应该在CheckBox
上使用setOnClickListener
,而是需要使用setOnCheckedChangeListener
,它具有isChecked
回调参数。
此外,不要在适配器中以编程方式设置CheckBox
值,因为这应该由用户触发
所以替换:
checkbox.setOnClickListener {
if (!checkBoxStateArray.get(bindingAdapterPosition, false)).{//checkbox checked
checkbox.isChecked = true
//stores checkbox states and position
checkBoxStateArray.put(bindingAdapterPosition, true)
} else {//checkbox unchecked
checkbox.isChecked = false
//stores checkbox states and position.
checkBoxStateArray.put(bindingAdapterPosition, false)
}
与:
checkbox.setOnCheckedChangeListener(CompoundButton.OnCheckedChangeListener { buttonView, isChecked ->
checkBoxStateArray.put(bindingAdapterPosition, isChecked)
})
>
在适配器类itemCheckListener的构造函数中传递回调函数:(isChecked: Boolean,data:MutableList)-
如果isChecked为true则获取数据
//使其全局化,您可以使用任何类而不是字符串类
private val data = mutableListOf<String>()
holder.binding.isChecked.setOnCheckedChangeListener { _, isChecked ->
data.add(getItemPosition)
itemCheckListener(isChecked, data)
}
//获取数据
val myAdapter: MyAdapterClass by lazy {
MyAdapterClass { isActive, data->
Log.d("CLICKS", "YOU CLICK FRAGMENT $data")}
}