Lists are continuous, vertical indexes of text or images.
ClickableListItemSample
@Preview
@Composable
fun ClickableListItemSample() {
Column {
HorizontalDivider()
repeat(3) { idx ->
var count by rememberSaveable { mutableIntStateOf(0) }
ListItem(
onClick = { count++ },
leadingContent = { Icon(Icons.Default.Home, contentDescription = null) },
trailingContent = { Text("$count") },
supportingContent = { Text("Additional info") },
content = { Text("Item ${idx + 1}") },
)
HorizontalDivider()
}
}
}
ClickableListItemWithClickableChildSample
@Preview
@Composable
fun ClickableListItemWithClickableChildSample() {
Column {
HorizontalDivider()
repeat(3) { idx ->
ListItem(
onClick = { /* ListItem onClick callback */ },
leadingContent = { Icon(Icons.Default.Home, contentDescription = null) },
trailingContent = {
IconButton(onClick = { /* Child onClick callback */ }) {
Icon(Icons.Default.Favorite, contentDescription = "Localized description")
}
},
supportingContent = { Text("The trailing icon has a separate click action") },
content = { Text("Item ${idx + 1}") },
)
HorizontalDivider()
}
}
}
ListItemWithModeChangeOnLongClickSample
@Preview
@Composable
fun ListItemWithModeChangeOnLongClickSample() {
Column {
HorizontalDivider()
var inClickMode by rememberSaveable { mutableStateOf(true) }
val counts = rememberSaveable { mutableStateListOf(0, 0, 0) }
val checked = rememberSaveable { mutableStateListOf(false, false, false) }
repeat(3) { idx ->
if (inClickMode) {
ListItem(
onClick = { counts[idx]++ },
onLongClick = {
checked[idx] = true
inClickMode = false
},
leadingContent = { Icon(Icons.Default.Home, contentDescription = null) },
trailingContent = { Text("${counts[idx]}") },
supportingContent = { Text("Long-click to change interaction mode.") },
content = { Text("Item ${idx + 1}") },
)
} else {
ListItem(
checked = checked[idx],
onCheckedChange = { checked[idx] = it },
onLongClick = {
inClickMode = true
checked.clear()
checked.addAll(listOf(false, false, false))
},
leadingContent = { Checkbox(checked = checked[idx], onCheckedChange = null) },
trailingContent = { Icon(Icons.Default.Favorite, contentDescription = null) },
supportingContent = { Text("Long-click to change interaction mode.") },
content = { Text("Item ${idx + 1}") },
)
}
HorizontalDivider()
}
}
}
MultiSelectionListItemSample
@Preview
@Composable
fun MultiSelectionListItemSample() {
Column {
HorizontalDivider()
repeat(3) { idx ->
var checked by rememberSaveable { mutableStateOf(false) }
ListItem(
checked = checked,
onCheckedChange = { checked = it },
leadingContent = { Checkbox(checked = checked, onCheckedChange = null) },
trailingContent = { Icon(Icons.Default.Favorite, contentDescription = null) },
supportingContent = { Text("Additional info") },
content = { Text("Item ${idx + 1}") },
)
HorizontalDivider()
}
}
}
SingleSelectionListItemSample
@Preview
@Composable
fun SingleSelectionListItemSample() {
Column(Modifier.selectableGroup()) {
HorizontalDivider()
var selectedIndex: Int? by rememberSaveable { mutableStateOf(null) }
repeat(3) { idx ->
val selected = selectedIndex == idx
ListItem(
selected = selected,
onClick = { selectedIndex = if (selected) null else idx },
leadingContent = { RadioButton(selected = selected, onClick = null) },
trailingContent = { Icon(Icons.Default.Favorite, contentDescription = null) },
supportingContent = { Text("Additional info") },
content = { Text("Item ${idx + 1}") },
)
HorizontalDivider()
}
}
}
StandardListItems
@Preview
@Composable
fun StandardListItems() {
Column {
HorizontalDivider()
ListItem(
leadingContent = { Icon(Icons.Filled.Favorite, contentDescription = null) },
content = { Text("One line list item") },
)
HorizontalDivider()
ListItem(
leadingContent = { Icon(Icons.Filled.Favorite, contentDescription = null) },
supportingContent = { Text("Supporting text") },
content = { Text("Two line list item") },
)
HorizontalDivider()
ListItem(
leadingContent = { Icon(Icons.Filled.Favorite, contentDescription = null) },
overlineContent = { Text("Overline text") },
supportingContent = { Text("Supporting text") },
content = { Text("Three line list item") },
)
HorizontalDivider()
ListItem(
leadingContent = { Icon(Icons.Filled.Favorite, contentDescription = null) },
supportingContent = { Text("Supporting text\nthat is multiple lines") },
content = { Text("Another three line list item") },
)
HorizontalDivider()
}
}