Functionality Description:
Switch in Activity:
When the switch is turned on, all checkboxes within the RecyclerView should be checked (set to true).
When the switch is turned off, all checkboxes within the RecyclerView should be unchecked (set to false).
Manual Checkbox Handling:
Users can manually check and uncheck individual checkboxes.
If all checkboxes are manually checked, the switch should automatically turn on.
If any checkbox is manually unchecked while the switch is on, the switch should automatically turn off.
class BhkItemCheckboxAdapter(
private val context: Context,
private var items: List<BHK>,
private val onRadioButtonClick: OnCheckButtonClick
) : RecyclerView.Adapter<BhkItemCheckboxAdapter.ItemViewHolder>() {
var isAllChecked = false
inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val headTextView: TextView = view.findViewById(R.id.headTextView)
val llRoot: LinearLayout = view.findViewById(R.id.llRoot)
val cbType: CheckBox = view.findViewById(R.id.cbType)
init {
cbType.setOnCheckedChangeListener { _, isChecked ->
if (isChecked) {
llRoot.setBackgroundResource(R.drawable.black_background)
headTextView.setTextColor(context.getColor(R.color.search_field_child_text_white))
} else {
llRoot.setBackgroundResource(R.drawable.gray_background)
headTextView.setTextColor(context.getColor(R.color.search_field_child_text_black))
}
items[adapterPosition].checked = isChecked
checkAllChecked()
}
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder {
val view = LayoutInflater.from(parent.context)
.inflate(R.layout.item_child_checkbox, parent, false)
return ItemViewHolder(view)
}
override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {
val item = items[position]
holder.headTextView.text = item.value
holder.cbType.isChecked = item.checked
if (item.checked){
holder.llRoot.setBackgroundResource(R.drawable.black_background)
holder.headTextView.setTextColor(context.getColor(R.color.search_field_child_text_white))
}
else{
holder.llRoot.setBackgroundResource(R.drawable.gray_background)
holder.headTextView.setTextColor(context.getColor(R.color.search_field_child_text_black))
}
holder.itemView.setOnClickListener {
holder.cbType.isChecked = !holder.cbType.isChecked
items[position].checked = holder.cbType.isChecked
onRadioButtonClick.onClick(items[position].id)
checkAllChecked()
}
}
override fun getItemCount(): Int {
return items.size
}
fun updateItems(checked: Boolean) {
isAllChecked = checked
for (item in items) {
item.checked = checked
}
notifyDataSetChanged()
onRadioButtonClick?.onAllChecked(checked)
}
private fun checkAllChecked() {
for (item in items) {
if (!item.checked) {
isAllChecked = false
onRadioButtonClick?.onAllChecked(false)
return
}
}
isAllChecked = true
onRadioButtonClick?.onAllChecked(true)
}
}
Activity Code
private fun setBedrooms(bhk: List<BHK>) {
if (bhk != null) {
llProperty.visibility = View.VISIBLE
bhkList = bhk;
lvBhkType = findViewById(R.id.lvBhkType)
lvBhkType.layoutManager =
GridLayoutManager(this, 3)
val itemClickListener = object : OnCheckButtonClick {
override fun onClick(id: String?, value: String?) {
if (id != null) {
bhkId += "$id,"
}
}
override fun onAllChecked(checked: Boolean) {
rbBHKAll.isChecked = checked
}
}
bhkAdapter = BhkItemCheckboxAdapter(this, bhk, itemClickListener)
lvBhkType.adapter = bhkAdapter
}
}
rbBHKAll.setOnCheckedChangeListener { _, isChecked ->
bhkId = if (isChecked) {
bhkList.joinToString(",") { it.id.toString() }
} else {
""
}
bhkAdapter?.updateItems(isChecked)
}