Lists:普通条目、选择模式与 SegmentedListItem · AndroidX 源码指南
AAndroidX 源码指南
M3E 设计系统
M3E 设计系统 · androidx.compose.material3

Lists:普通条目、选择模式与 SegmentedListItem1.5.0-alpha25

用 ListItem 的不同重载表达点击、子控件、单选、多选与分段容器,避免语义冲突。

最后更新 2026-08-01

Expressive 列表

列表变体

catalog 覆盖的 Expressive 场景

包括标准列表、ClickableListItem、带可点击子控件、单选、多选、长按进入模式,以及对应的 SegmentedListItem。

整行点击与子控件点击

如果整行与 trailing switch 都可点击,必须避免一次手势触发两个动作,并给各自清晰语义。源码提供相应 ListItem 重载,不要简单在整个 Row 外再包 clickable。

SegmentedListItem

它用于一组视觉连接的列表项,并根据首、中、尾位置处理容器形状。展开条目还需要保存 expansion state,不能把高度动画当作数据状态。

选择模式

  • 单选:一个 selected id,并使用 radio 语义。
  • 多选:集合或每项 Boolean,并使用 checkbox 语义。
  • 长按进入模式:模式状态与项目选择状态分开保存。

复制即用

可点击的 ListItem 与单选列表:

import androidx.compose.material3.ListItem
import androidx.compose.material3.RadioButton
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue

@Composable
fun ClickableRow() {
    ListItem(
        headlineContent = { Text("条目") },
        supportingContent = { Text("副标题") },
        onClick = { /* 整行点击 */ },
    )
}

@Composable
fun SingleChoiceList(options: List<String>) {
    var selectedId by remember { mutableStateOf<String?>(null) }

    options.forEach { option ->
        ListItem(
            headlineContent = { Text(option) },
            leadingContent = {
                RadioButton(
                    selected = selectedId == option,
                    onClick = { selectedId = option },
                )
            },
            onClick = { selectedId = option },
        )
    }
}

单选用 radio 语义,多选用 checkbox 语义;整行与 trailing 控件都可点击时避免一次手势触发两个动作。