mardi 3 mai 2022

How to select all checkboxes in recyclerview on click?

I display several items in the recyclerview, each item has its own checkbox, I want to select the necessary ones and delete them. I did this part and it works well, but I can’t do select all items, please tell me what’s wrong.

Here is my code:

initRecyclerView

    private fun initRecyclerView() {
        binding.recyclerView.setHasFixedSize(true)
        val adapter = AdapterList(requireActivity(), arrayList)
        binding.recyclerView.layoutManager = LinearLayoutManager(requireActivity().applicationContext, LinearLayoutManager.VERTICAL, false)
        binding.recyclerView.adapter = adapter
    }

My function for checkbox in fragment:

        binding.allCheckBox.setOnClickListener {
            if (isAllSelect) {
                AdapterList().unselectAll()
                isAllSelect = false
            } else {
                AdapterList().selectAll()
                isAllSelect = true
            }
        }

My adapter

class AdapterList(private val activity: Activity? = null, private var recyclerList: ArrayList<Info>? = null) :
    RecyclerView.Adapter<RecyclerView.ViewHolder>() {

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        return (holder as ViewHolder).bind(recyclerList!![position])
    }

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

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        return ViewHolder(LayoutInflater.from(activity).inflate(R.layout.item_layout, parent, false))
    }

    private var isSelectedAll = false
    @SuppressLint("NotifyDataSetChanged")
    fun selectAll() {
        isSelectedAll = true
        notifyDataSetChanged()
    }

    @SuppressLint("NotifyDataSetChanged")
    fun unselectAll() {
        isSelectedAll = false
        notifyDataSetChanged()
    }

    inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
        private var binding: ItemLayoutBinding = ItemLayoutBinding.bind(view)

        @SuppressLint("NotifyDataSetChanged")
        fun bind(list: Info) {
            binding.apply {
                cardIcon.setImageDrawable(list.icon)
                cardName.text = list.name
                cardCheckBox.setOnCheckedChangeListener { _: CompoundButton?, isChecked: Boolean ->
                    recyclerList!![position].checked = isChecked
                    notifyDataSetChanged()
                }
                cardCheckBox.isChecked = isSelectedAll
            }

        }
    }

}

Now it crashes on clicking on the checkbox in cardview because of the line

cardCheckBox.isChecked = isSelectedAll

in Adapter Tried to do as described here but does not work Select all checkboxes in RecyclerView

If I do so

        binding.allCheckBox.setOnClickListener {
            if (isAllSelect) {
                for (list in arrayList) {
                    list.checked = false
                }
                isAllSelect = false
            } else {
                for (list in arrayList) {
                    list.checked = true
                }
                isAllSelect = true
            }
        }

By clicking on the delete button, I see that the data is correct, but the checkbox in the recyclerview is not updated (notifyDataSetChanged() does not work?), and I'm not sure if this approach is correct




Aucun commentaire:

Enregistrer un commentaire