复选框总是检查 recyclerview 中的最后一项

chekbox always checking last item in recyclerview

我想从我的 recyclerview 项目中选中的复选框中获取项目,这是我的适配器

class SelectedListDateAdapter(var listDate: List<DateDay>, private val onItemCheckListener: OnItemCheckListener) :
RecyclerView.Adapter<SelectedListDateAdapter.SelectedListDateViewHolder>() {
lateinit var  binding: ItemCheckBoxDateBinding
inner class SelectedListDateViewHolder(item: ItemCheckBoxDateBinding) : RecyclerView.ViewHolder(item.root) {
    val checkBoxList = item.checkBox
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SelectedListDateViewHolder {
    binding = ItemCheckBoxDateBinding.inflate(
        LayoutInflater.from(parent.context),
        parent,
        false
    )
    return SelectedListDateViewHolder(binding)
}

override fun onBindViewHolder(holder: SelectedListDateViewHolder, position: Int) {
    holder.checkBoxList.setOnCheckedChangeListener(null)
    holder.checkBoxList.isChecked = listDate[position].isSelected
    holder.itemView.apply {
        val currentItem = listDate[position]
        binding.tvDateList.text = listDate[position].date

        setOnClickListener {
            binding.checkBox.isChecked = !binding.checkBox.isChecked
            if (binding.checkBox.isChecked) {
                binding.checkBox.setOnCheckedChangeListener { buttonView, isChecked ->
                    currentItem.isSelected = isChecked
                }
                onItemCheckListener.onItemCheck(currentItem)
            } else {
                binding.checkBox.setOnCheckedChangeListener { buttonView, isChecked ->
                    currentItem.isSelected = isChecked
                }
                onItemCheckListener.onItemUncheck(currentItem)
            }
        }
    }
}

override fun getItemCount(): Int {
    return listDate.size
}

}

我提到这个问题 来制作那个适配器

是的,它获取项目并将其删除,但每次我在 recyclerview 中单击一个项目时,它总是选中和取消选中最后一个项目

我已经检查了这个问题但我的结果还是一样,感谢任何帮助

也许 viewHolder 重用之前的 item.Try 来更新 listData,而不是 currentItem。 并移动嵌套的 Listener

override fun onBindViewHolder(holder: SelectedListDateViewHolder, position: Int) {

    holder.itemView.tvDateList.text = listDate[position].date
    holder.checkBoxList.isChecked = listDate[position].isChecked
    holder.checkBoxList.setOnClickListener {

       listDate[position].isSelected = holder.checkBoxList.isChecked
    }

    holder.itemView.setOnClickListener {

        holder.checkBoxList.isChecked = !holder.checkBoxList.isChecked
        listDate[position].isSelected = holder.checkBoxList.isChecked

        val currentItem = listDate[position]
        if (holder.checkBoxList.isChecked) {

            onItemCheckListener.onItemCheck(currentItem)

        } else {

            onItemCheckListener.onItemUncheck(currentItem)
        }
    }
}