LazyColumn ist eine Composable-Funktion in Jetpack Compose zum Erstellen vertikaler Listen mit Lazy Loading von Elementen. Im Gegensatz zu Column erstellt und komponiert LazyColumn nur die auf dem Bildschirm sichtbaren Elemente und verwendet sie beim Scrollen wieder. Laut Google Android Documentation, 2025 ist LazyColumn dank effizienter Speicherverwaltung das primäre Werkzeug zum Anzeigen großer Datenmengen in mobilen Anwendungen.
Wichtige Erkenntnisse
LazyColumn ist eine Composable-Funktion, die eine vertikale scrollbare Liste mit Lazy Loading implementiert. Im Gegensatz zu Column, das alle untergeordneten Elemente auf einmal rendert, erstellt LazyColumn nur Elemente, die sich im Ansichtsbereich befinden.
Der Lazy-Loading-Mechanismus in LazyColumn basiert auf der Wiederverwendung von Elementen: Wenn ein Element beim Scrollen ausgeblendet wird, können seine Komposition und sein Layout für ein neu angezeigtes Element wiederverwendet werden. Dies spart Speicher und CPU-Zeit, insbesondere bei langen Listen.
Laut Android Developers Blog, 2024 kann LazyColumn Listen mit Zehntausenden von Elementen effizient verarbeiten, ohne dass die Leistung signifikant beeinträchtigt wird. Jedes Element in LazyColumn hat einen Schlüssel (key), der Compose hilft, den Zustand des Elements zu identifizieren und zu bewahren, wenn sich die Liste ändert.
LazyColumn akzeptiert die Parameter modifier, state, contentPadding, reverseLayout, verticalArrangement und horizontalAlignment. Der Inhalt wird in einem Lambda-Block über die DSL-Funktionen items und item definiert.
@Composable
fun SimpleLazyColumn() {
val itemsList = (1..100).toList()
LazyColumn(
modifier = Modifier.fillMaxSize(),
verticalArrangement = Arrangement.spacedBy(8.dp),
contentPadding = PaddingValues(16.dp)
) {
items(itemsList) { item ->
Text(text = "Element $item")
}
}
}
Der DSL-Block von LazyColumn stellt die Funktionen items und item zum Hinzufügen von Inhalten bereit. items akzeptiert eine Datensammlung, einen Schlüssel und eine Factory-Funktion zum Erstellen von Elementen. item fügt ein einzelnes statisches Element zur Liste hinzu.
itemsIndexed ist eine Variante von items, die zusätzlich zu den Daten den Elementindex übergibt. Dies ist nützlich, wenn Sie die Position des Elements ohne separate Berechnung kennen müssen. items(size) akzeptiert nur die Anzahl der Elemente und eine Factory ohne Bindung an eine Sammlung.
Der Parameter key in items identifiziert jedes Element eindeutig. Laut Material Design Guidelines, 2025 verbessern Schlüssel die Leistung beim Aktualisieren und Animieren von Elementen, da Compose die Bewegung oder Änderung eines bestimmten Elements anhand seines Schlüssels verfolgen kann.
Die Funktion items mit contentType ermöglicht es LazyColumn, die Wiederverwendung von Elementen verschiedener Typen zu optimieren. Im folgenden Beispiel werden Abschnittsüberschriften und normale Zeilen in einer einzigen Liste verwendet.
@Composable
fun MixedItemsList() {
LazyColumn {
item {
Text(
text = "Kopfzeile",
style = MaterialTheme.typography.headlineMedium
)
}
items(
items = (1..20).toList(),
key = { it },
contentType = { "item" }
) { item ->
Text(text = "Zeile $item")
}
}
}
LazyListState ist ein Zustandsobjekt von LazyColumn, das die aktuelle Scrollposition, das erste sichtbare Element und den Offset verfolgt. Es kann über rememberLazyListState() erstellt und an den state-Parameter von LazyColumn übergeben werden.
LazyListState bietet die Methoden animateScrollToItem und scrollToItem zum programmatischen Scrollen zu einem bestimmten Element. animateScrollToItem erzeugt eine sanfte Scroll-Animation, während scrollToItem sofort scrollt. Beide Methoden müssen innerhalb einer Koroutine im CompositionContext aufgerufen werden.
Laut Android Developers, 2024 enthält LazyListState auch layoutInfo, das Informationen über die sichtbaren Elemente liefert — deren Indizes, Offsets und Größen. Dies ist nützlich für die Implementierung von Analysen, View-Tracking oder unendlichem Scrollen.
In diesem Beispiel wird LazyColumn über LazyListState gesteuert. Ein Button scrollt die Liste mit einer sanften Animation zum Element mit Index 50.
@Composable
fun ScrollableList() {
val listState = rememberLazyListState()
val scope = rememberCoroutineScope()
Column {
Button(
onClick = {
scope.launch {
listState.animateScrollToItem(50)
}
}
) {
Text("Zu 50 scrollen")
}
LazyColumn(state = listState) {
items((1..100).toList()) { item ->
Text(
text = "Element $item",
modifier = Modifier.padding(8.dp)
)
}
}
}
}
Der wichtigste Leistungsfaktor von LazyColumn ist die korrekte Verwendung von Schlüsseln. Jedes Element sollte über den key-Parameter einen eindeutigen stabilen Schlüssel haben. Ohne Schlüssel kann Compose Elemente bei Datenänderungen nicht korrekt wiederverwenden, was zu Rekomposition führt.
contentType teilt LazyColumn mit, welche Elemente denselben Layout-Typ haben. Wenn zwei Elemente mit demselben contentType in den Wiederverwendungspool gelangen, kann LazyColumn ihr Layout ohne Rekomposition wiederverwenden. Laut Android Developers Blog, 2024 verbessert contentType die Leistung um 30–50% in Listen mit verschiedenen Elementtypen.
Für LazyColumn ist es auch wichtig, instabile Parameter in Factory-Funktionen zu vermeiden. Jedes Mal, wenn sich ein Elementparameter ändert, komponiert Compose dieses Element neu. Die Verwendung von remember und derivedStateOf für stabile Werte reduziert die Anzahl der Rekompositionen.
| Faktor | Auswirkung | Empfehlung |
|---|---|---|
| Schlüssel (key) | Kritisch | Legen Sie immer einen eindeutigen stabilen key für items fest |
| contentType | Erheblich | Geben Sie den Elementtyp an, um die Wiederverwendung zu optimieren |
| Elementgröße | Mäßig | Verwenden Sie wo möglich feste Größen |
| Verschachtelte Listen | Kritisch | Vermeiden Sie LazyColumn innerhalb von LazyColumn — verwenden Sie LazyVerticalGrid |
stickyHeader ist eine DSL-Funktion von LazyColumn, die eine Abschnittsüberschrift beim Scrollen am oberen Rand der Liste fixiert. Wenn der nächste Abschnitt den oberen Rand erreicht, ersetzt seine Überschrift die aktuelle. Dieses Verhalten ist Benutzern von Kontaktlisten und Kalendern vertraut.
stickyHeader akzeptiert einen Schlüssel und eine Factory-Funktion, ähnlich wie item. Im Gegensatz zu einem normalen item bleibt stickyHeader sichtbar, während durch den Inhalt seines Abschnitts gescrollt wird. Wenn ein Abschnitt vollständig gescrollt ist, schiebt die Überschrift des nächsten Abschnitts die vorherige hinaus.
Laut Material Design Guidelines, 2025 verbessern sticky header die Navigation in langen Listen und reduzieren die kognitive Belastung des Benutzers. Um einen sticky header zu implementieren, umschließen Sie einfach eine Abschnittsüberschrift in der richtigen Position relativ zu den items-Elementen mit stickyHeader.
@Composable
fun SectionedList(sections: Map<String, List<String>>) {
LazyColumn {
sections.forEach { (header, items) ->
stickyHeader {
Text(
text = header,
modifier = Modifier.background(Color.White)
.padding(16.dp)
)
}
items(items) { item ->
Text(text = item, modifier = Modifier.padding(8.dp))
}
}
}
}
Häufig gestellte Fragen
Column rendert alle Elemente auf einmal und eignet sich für Listen mit bis zu 20–30 Elementen. LazyColumn erstellt nur sichtbare Elemente und verwendet sie beim Scrollen wieder, sodass Sie mit Tausenden von Elementen ohne Leistungsverlust arbeiten können.
Verwenden Sie Arrangement.spacedBy im Parameter verticalArrangement oder items-Funktionen mit einem Trennzeichen über den Index. Für komplexe Trennzeichen fügen Sie ein separates item mit Divider() zwischen den Listenelementen hinzu.
LazyColumn wird automatisch neu komponiert, wenn sich die Datensammlung ändert, sofern stabile Schlüssel verwendet werden. Datenänderungen, die über mutableStateListOf oder StateFlow erkannt werden, führen dazu, dass nur die geänderten Elemente neu gezeichnet werden.
Direkte Verschachtelung von LazyColumn in LazyColumn wird nicht empfohlen — beide haben unabhängiges Scrollen, was zu Gestenkonflikten führt. Verwenden Sie stattdessen eine normale Column mit LazyColumn innerhalb einer scrollbaren Section oder LazyVerticalGrid für Raster.
Verwenden Sie LazyListState.layoutInfo.visibleItemsInfo und vergleichen Sie den Index des letzten sichtbaren Elements mit der Gesamtzahl der Elemente. Für unendliches Scrollen verfolgen Sie, wann sich das letzte sichtbare Element dem Ende der Liste nähert.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch