Android ChipGroup 使用说明

ChipGroup 使用文档

1. 简介

ChipGroup 是 Material 组件中用于承载多个 Chip 的容器,适合以下场景:

  • 标签展示(不可点击)
  • 条件筛选(单选/多选)
  • 动态标签列表(如识别结果、关键词等)

在当前项目中,ChipGroup 用于"识别结果标签列表"的展示,并配合 RecyclerView 实现"折叠/展开"效果。


2. 依赖要求

项目已包含依赖:

gradle 复制代码
implementation 'com.google.android.material:material:1.9.0'

3. 基础 XML 用法

xml 复制代码
<com.google.android.material.chip.ChipGroup
    android:id="@+id/chip_group"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:singleLine="false"
    app:chipSpacingHorizontal="6dp"
    app:chipSpacingVertical="6dp" />

常用属性

  • app:singleLine:是否单行显示,false 表示自动换行
  • app:chipSpacingHorizontal:横向间距
  • app:chipSpacingVertical:纵向间距
  • app:singleSelection:是否单选模式
  • app:selectionRequired:单选时是否要求必须有一个选中项

4. 动态添加 Chip(展示型)

适用于识别结果、标签云等动态数据场景。

kotlin 复制代码
private fun renderChips(chipGroup: ChipGroup, tags: List<String>) {
    chipGroup.removeAllViews()

    val showTags = if (tags.isEmpty()) listOf("无") else tags
    showTags.forEach { tag ->
        val chip = Chip(chipGroup.context).apply {
            text = "\u2022 $tag"
            isClickable = false
            isCheckable = false
            closeIcon = null
            chipStartPadding = 10f
            chipEndPadding = 10f
            setTextColor(0xFFBFC9EA.toInt())
            textSize = 13f
            setChipBackgroundColorResource(android.R.color.transparent)
            setBackgroundResource(R.drawable.bg_tag_chip)
        }
        chipGroup.addView(chip)
    }
}

注意事项

  • RecyclerView item 复用时必须先调用 removeAllViews(),避免重复叠加。
  • 展示型场景建议设置 isClickable=false、isCheckable=false。

5. 单选/多选筛选用法

如果用于筛选功能,可开启可选中状态:

xml 复制代码
<com.google.android.material.chip.ChipGroup
    android:id="@+id/chip_group_filter"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:singleSelection="true"
    app:selectionRequired="true" />
kotlin 复制代码
val chip = Chip(context).apply {
    id = View.generateViewId()
    text = "前方"
    isCheckable = true
}
chipGroup.addView(chip)

chipGroup.setOnCheckedStateChangeListener { _, checkedIds ->
    // checkedIds: 当前选中的 Chip id 列表
}

6. 折叠/展开场景实现建议

当标签数量较多时,建议在 Adapter 中控制:

  1. 设置折叠阈值(如 3 个)
  2. 折叠态仅显示前 N 个标签
  3. 超过阈值显示箭头按钮
  4. 点击箭头切换 expanded 状态并 notifyItemChanged(position)

示例逻辑:

kotlin 复制代码
val canExpand = item.tags.size > collapsedVisibleCount
val visibleTags = if (item.expanded || !canExpand) {
    item.tags
} else {
    item.tags.take(collapsedVisibleCount)
}
renderChips(binding.chipGroup, visibleTags)

7. 性能建议

  • 避免在高频回调中无条件重建全部 Chip。
  • 先比较新旧数据,只有变化时再刷新 item。
  • 可结合节流(throttle)降低 UI 更新频率。
  • 极大数据量时可考虑将标签改为文本聚合展示,降低 View 数量。

相关推荐
半摆烂日常2 小时前
低代码平台API对接实践:接口鉴权与数据同步的完整实现
android·低代码·rxjava
事圆则缓3 小时前
volatile 使用场景全解析:它能保证什么,又解决不了什么
android
蒲公英内测分发3 小时前
智能投影仪参加海外展会,未上架的 Android 配套 App 怎么让客户限时试用?
android
ii_best4 小时前
按键精灵手机端开发安卓版实战:手写一个可最小化、可拖动的「运行日志悬浮窗」(附完整 源码 + 踩坑记录)
android·ios·智能手机·自动化·ai编程·按键精灵
终端安全笔记4 小时前
安卓做 MDM 管控,先分清三种注册入口
android·安全·智能手机
乌萨达5 小时前
手机模拟器安卓怎么用?电脑安装应用、玩手游与账号同步指南
android·智能手机·电脑·雷电模拟器
美狐美颜SDK开放平台5 小时前
Android与iOS直播APP美颜有什么区别?视频美颜SDK开发详解
android·ios·音视频·视频美颜sdk
春猿火7 小时前
某市-2026【网安·论道】misc-afterimage_note-wp
android
恋猫de小郭8 小时前
Shopify 回应为什么从 RN 回到原生,为什么不用 KMP ?
android·前端·flutter
fundroid10 小时前
Android AI 开发,真正拉开差距的是工程闭环
android·ai·大模型·agent