Android Kotlin中RecyclerView复选框与开关联动实现方案
功能需求
Activity中的开关控制
- 开关开启时,RecyclerView内所有Checkbox需全部勾选(设为true)。
- 开关关闭时,RecyclerView内所有Checkbox需全部取消勾选(设为false)。
手动操作Checkbox的联动逻辑
- 用户可手动勾选或取消单个Checkbox。
- 若所有Checkbox被手动勾选,开关需自动切换为开启状态。
- 若开关处于开启状态时,任意Checkbox被手动取消勾选,开关需自动切换为关闭状态。
实现代码
BhkItemCheckboxAdapter 代码
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 代码
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) }
内容的提问来源于stack exchange,提问作者Sne
相关产品推荐
相关产品推荐

