Skip to main content

List

Lists are continuous, vertical indexes of text and images. Follows the Material Design 3 Lists specification.

Usage

import { List, ListItem, ListDivider } from '@onlynative/components'
import { ThemeProvider } from '@onlynative/core'
import { SafeAreaProvider } from 'react-native-safe-area-context'

export default function App() {
return (
<SafeAreaProvider>
<ThemeProvider>
<List>
<ListItem headlineText="Photos" supportingText="Jan 9, 2024" />
<ListDivider />
<ListItem headlineText="Recipes" supportingText="Jan 17, 2024" />
<ListDivider />
<ListItem headlineText="Work" supportingText="Jan 28, 2024" />
</List>
</ThemeProvider>
</SafeAreaProvider>
)
}

List item templates

List items auto-detect their height from the content provided:

TemplatePropsMin height
One-lineheadlineText only56dp
Two-line+ supportingText or overlineText72dp
Three-line+ both, or multi-line supportingText88dp

Leading and trailing content

Pass any ReactNode as leadingContent or trailingContent:

import { List, ListItem } from '@onlynative/components'
import { ThemeProvider } from '@onlynative/core'
import { SafeAreaProvider } from 'react-native-safe-area-context'
import { MaterialCommunityIcons } from '@expo/vector-icons'

export default function App() {
return (
<SafeAreaProvider>
<ThemeProvider>
<List>
<ListItem
headlineText="Wi-Fi"
supportingText="Connected"
leadingContent={<MaterialCommunityIcons name="wifi" size={24} />}
trailingSupportingText="On"
/>
</List>
</ThemeProvider>
</SafeAreaProvider>
)
}

Interactive items

When onPress is provided, the item renders as a Pressable with state-layer feedback:

import { List, ListItem } from '@onlynative/components'
import { ThemeProvider } from '@onlynative/core'
import { SafeAreaProvider } from 'react-native-safe-area-context'
import { Alert } from 'react-native'

export default function App() {
return (
<SafeAreaProvider>
<ThemeProvider>
<List>
<ListItem
headlineText="Settings"
onPress={() => Alert.alert('Tapped')}
/>
</List>
</ThemeProvider>
</SafeAreaProvider>
)
}

Inset dividers

Use inset to align the divider with text that follows a leading icon:

import { List, ListItem, ListDivider } from '@onlynative/components'
import { ThemeProvider } from '@onlynative/core'
import { SafeAreaProvider } from 'react-native-safe-area-context'
import { MaterialCommunityIcons } from '@expo/vector-icons'

export default function App() {
return (
<SafeAreaProvider>
<ThemeProvider>
<List>
<ListItem
headlineText="Item 1"
leadingContent={<MaterialCommunityIcons name="folder" size={24} />}
/>
<ListDivider inset />
<ListItem
headlineText="Item 2"
leadingContent={<MaterialCommunityIcons name="folder" size={24} />}
/>
</List>
</ThemeProvider>
</SafeAreaProvider>
)
}

List Props

PropTypeDefaultRequiredDescription
childrenReactNode-YesContent rendered inside the list container.
styleStyleProp<ViewStyle>-No-

ListItem Props

PropTypeDefaultRequiredDescription
headlineTextstring-YesPrimary text displayed on the list item.
supportingTextstring-NoSecondary text displayed below the headline.
overlineTextstring-NoText displayed above the headline (e.g. category label).
trailingSupportingTextstring-NoShort text displayed at the trailing edge (e.g. "100+", timestamp).
leadingContentReactNode-NoContent rendered before the text block (icon, avatar, image, checkbox).
trailingContentReactNode-NoContent rendered after the text block (icon, switch, checkbox).
onPress() => void-NoWhen provided, the item becomes interactive (Pressable). Omit to render as a plain View.
disabledbooleanNoDisables the press interaction and reduces opacity. Only effective when `onPress` is provided.
containerColorstring-NoOverride the container (background) color. State-layer colors (hover, press) are derived automatically.
contentColorstring-NoOverride the headline text color. Overline, supporting, and trailing-supporting text keep their MD3 muted variants (`onSurfaceVariant`) — those are intentionally distinct from the primary content color.
supportingTextNumberOfLinesnumber1NoMaximum number of lines for supportingText before truncating.
styleStyleProp<ViewStyle>-No-

ListDivider Props

PropTypeDefaultRequiredDescription
insetbooleanNoWhen true, adds a leading inset so the divider aligns with text that follows a leading icon (56dp from the start edge).
styleStyleProp<ViewStyle>-No-