Using LazyColumn and LazyRow for Lists in Jetpack Compose
Categories:
4 minute read
Jetpack Compose, Google’s modern toolkit for building native Android UIs, introduces powerful tools for handling lists efficiently. One of the key components for displaying lists is LazyColumn and LazyRow, which enable efficient rendering of large datasets without sacrificing performance.
In this article, we will explore what LazyColumn and LazyRow are, how they work, and how you can use them to create smooth and efficient lists in your Jetpack Compose applications.
Understanding LazyColumn and LazyRow
When working with lists in traditional Android development using XML-based layouts and RecyclerView, developers had to implement complex view recycling mechanisms to ensure smooth scrolling performance. With Jetpack Compose, this process is significantly simplified using LazyColumn and LazyRow.
LazyColumn: A vertically scrolling list that only composes and lays out the currently visible items, making it more efficient than a regularColumn.LazyRow: A horizontally scrolling list that optimizes rendering by only composing visible items, similar toLazyColumnbut in a horizontal orientation.
Both of these composables leverage lazy loading techniques to improve performance when rendering large lists.
When to Use LazyColumn vs. LazyRow
Choosing between LazyColumn and LazyRow depends on the layout requirement:
- Use
LazyColumnwhen you need a vertical scrolling list (e.g., displaying a list of messages, a list of articles, or a vertical feed). - Use
LazyRowwhen you need a horizontal scrolling list (e.g., a carousel of images, horizontally scrolling categories, or horizontal card-based UI components).
Unlike a standard Column or Row, which renders all child items regardless of whether they are visible, LazyColumn and LazyRow only compose the items currently visible on the screen, improving memory usage and UI performance.
Implementing LazyColumn
To use LazyColumn, you define its items using the items function. Here’s an example demonstrating how to create a simple list with LazyColumn:
@Composable
fun SimpleLazyColumn() {
val itemsList = List(100) { "Item #$it" } // Creating a list of 100 items
LazyColumn {
items(itemsList) { item ->
Text(
text = item,
modifier = Modifier
.fillMaxWidth()
.padding(16.dp),
fontSize = 18.sp
)
}
}
}
Key Points
- The
itemsListcontains 100 elements, but only the visible items are rendered at any given time. - The
items()function insideLazyColumntakes a list and generates UI elements for each item. - The
modifierensures that each item has padding and takes up the full width of the screen.
Implementing LazyRow
Similarly, LazyRow is used for horizontal scrolling lists. Here’s an example:
@Composable
fun SimpleLazyRow() {
val itemsList = List(20) { "Item #$it" }
LazyRow(modifier = Modifier.padding(16.dp)) {
items(itemsList) { item ->
Card(
modifier = Modifier
.padding(8.dp)
.width(120.dp)
.height(80.dp),
shape = RoundedCornerShape(8.dp),
elevation = 4.dp
) {
Box(
contentAlignment = Alignment.Center,
modifier = Modifier.fillMaxSize()
) {
Text(text = item, fontSize = 16.sp)
}
}
}
}
}
Key Points
LazyRowis used to create a horizontally scrolling list.- Items are wrapped inside
Cardcomponents to create a visually appealing UI. Modifier.padding()ensures spacing between items.Boxis used to center the text inside each card.
Adding Headers and Footers
You can add headers and footers in LazyColumn and LazyRow using the item {} function. Here’s an example:
@Composable
fun LazyColumnWithHeaderFooter() {
val itemsList = List(50) { "Item #$it" }
LazyColumn {
item {
Text("Header", fontSize = 20.sp, fontWeight = FontWeight.Bold, modifier = Modifier.padding(16.dp))
}
items(itemsList) { item ->
Text(text = item, modifier = Modifier.padding(16.dp))
}
item {
Text("Footer", fontSize = 20.sp, fontWeight = FontWeight.Bold, modifier = Modifier.padding(16.dp))
}
}
}
Key Points
- The
item {}function is used to add a single non-repeating item (like a header or footer). - This technique is useful for adding section headers, banners, or dividers.
Handling Click Events
To make list items interactive, you can use Modifier.clickable.
@Composable
fun ClickableLazyColumn() {
val itemsList = List(10) { "Item #$it" }
LazyColumn {
items(itemsList) { item ->
Text(
text = item,
modifier = Modifier
.fillMaxWidth()
.padding(16.dp)
.clickable { println("Clicked on $item") },
fontSize = 18.sp
)
}
}
}
Key Points
Modifier.clickable {}makes each item clickable.- A simple
printlnstatement logs the clicked item (replace with actual event handling logic in a real app).
Conclusion
LazyColumn and LazyRow are essential components in Jetpack Compose for handling large lists efficiently. They offer a straightforward API, improved performance through lazy loading, and support for headers, footers, and interactions with minimal boilerplate code.
By leveraging these components, you can create smooth and optimized list-based UIs in your Jetpack Compose applications. Whether you’re displaying vertical lists with LazyColumn or horizontal carousels with LazyRow, these tools simplify the process of working with dynamic content in modern Android development.
Do you have any favorite use cases for LazyColumn or LazyRow? Let us know in the comments!
Feedback
Was this page helpful?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.