提问者:小点点

如何使用回收视图kotlin android复选框


我正在努力:

在我的片段中获取选中的复选框项

我所尝试的

所以,我知道有2种方法保存状态的复选框,而滚动在回收视图

  • 使用SparseBooleanArray()
  • 使用您的模型保存状态

我选择了选项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()) 

问题

如何从适配器到片段获取选定的项目。我的代码返回一个空列表。

我想从适配器中获取任何选中/选定的项目到我的片段(观察变化)


共2个答案

匿名用户

您不应该在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")}
                }