需要有效的方法来更新点击类别列表的视图

Need efficient way to update view on click for category list

我有一个观点,我需要 select 三个类别之一。

每个类别都是一个按钮。

所选类别应为黑底白字,而其他类别应为白底黑字。

我是通过为每个类别创建按钮并在每个点击事件上更新来完成的。 有没有更好的方法呢?

类别数不固定怎么办?

val filterBoth: Button = parentView.findViewById(R.id.filter_both)
val filterVeg: Button = parentView.findViewById(R.id.filter_veg)
val filterNonveg: Button = parentView.findViewById(R.id.filter_nonveg)

filterBoth.setOnClickListener(this)
filterVeg.setOnClickListener(this)
filterNonveg.setOnClickListener(this)

override fun onClick(view: View?) {
    filterBoth.backgroundTintList = ColorStateList.valueOf(R.color.white)
    filterBoth.setTextColor(R.color.black)
    filterVeg.backgroundTintList = ColorStateList.valueOf(R.color.white)
    filterVeg.setTextColor(R.color.black)
    filterNonveg.backgroundTintList = ColorStateList.valueOf(R.color.white)
    filterNonveg.setTextColor(R.color.black)
    when(view?.id) {
        R.id.filter_both -> {
            filterBoth.backgroundTintList = ColorStateList.valueOf(R.color.black)
            filterBoth.setTextColor(R.color.white)
        }
        R.id.filter_veg -> {
            filterVeg.backgroundTintList = ColorStateList.valueOf(R.color.black)
            filterVeg.setTextColor(R.color.white)
        }
        R.id.filter_nonveg -> {
            filterNonveg.backgroundTintList = ColorStateList.valueOf(R.color.black)
            filterNonveg.setTextColor(R.color.white)
        }
    }
}

编辑 我可以以某种方式使用 RadioButton 和 RadioGroup 来实现此功能吗?如何将单选按钮视图设置为选中和未选中状态的自定义视图?

您可以尝试这样的操作:

val filterButtons = listOf(filterBoth, filterVeg, filterNonveg)
filterButtons.forEach { btn ->
    btn.setOnClickListener {
        filterButtons.forEach {
            val bgColor = if(it == btn) R.color.black else R.color.white
            val textColor = if(it == btn) R.color.white else R.color.black
            it.backgroundTintList = ColorStateList.valueOf(bgColor)
            it.setTextColor(textColor)
        }
    }
}

What to do if the number of categories is not fixed?

只需在 filterButtons 列表中添加更多按钮,其他一切保持不变。

您可以使用 MaterialToggleButtonGroup 并将 singleSelection 设置为 true。这样你就可以像往常一样为它们设置主题,所有常见的按钮状态(如悬停)看起来都是正确的,如果另一个被选中它们会自动取消选中,并且它们会更好地与无障碍服务一起工作。

您可以在组布局上使用 addOnButtonCheckedListener 来处理被选中的按钮之一。

Material 此处也有设计文档:https://material.io/components/buttons/android#toggle-button