Exploring Multiple Ways to Populate a LazyColumn in Jetpack Compose

Paramjeet Singh
3 min readMay 19, 2024

There are multiple ways to add items to a LazyColumn in Jetpack Compose. Each method provides different capabilities for handling items, headers, footers, and more. Here are various ways to add items to a LazyColumn:

1. Using items with a List

This is the most common method, where you pass a list of items to the items function.

LazyColumn {
items(messages) { msg ->
MessageCard(msg)
}
}

2. Using itemsIndexed with a List

If you need the index of each item, you can use itemsIndexed.

LazyColumn {
itemsIndexed(messages) { index, msg ->
Text("Item #$index")
MessageCard(msg)
}
}

3. Using item for Single Items

You can use the item function to add a single item to the LazyColumn.

LazyColumn {
item {
Text("Header")
}
items(messages) { msg ->
MessageCard(msg)
}
item {
Text("Footer")
}
}

4. Using Multiple items Blocks

You can combine multiple items blocks to group different types of items within the same LazyColumn.

val headerMessages = listOf(Message("Header", "1"), Message("Header", "2"))
val footerMessages = listOf(Message("Footer", "1"), Message("Footer", "2"))

LazyColumn {
items(headerMessages) { msg ->
MessageCard(msg)
}
items(messages) { msg ->
MessageCard(msg)
}
items(footerMessages) { msg ->
MessageCard(msg)
}
}

5. Using items with a LazyListScope

You can define a separate composable that takes a LazyListScope as a parameter. This allows you to modularize and reuse the item definitions.

@Composable
fun MyLazyListContent(scope: LazyListScope) {
scope.apply {
items(messages) { msg ->
MessageCard(msg)
}
item {
Text("Static Footer")
}
}
}

@Composable
fun Conversation() {
LazyColumn {
MyLazyListContent(this)
}
}

6. Using Custom Item Generation

You can use any iterable (e.g., ranges, sequences) to generate items.

val itemCount = 20

LazyColumn {
items(itemCount) { index ->
Text("Item #$index")
}
}

7. Using a Custom Data Structure

You can use a custom data structure and convert it to a list for the items function.

val map = mapOf("Key1" to "Value1", "Key2" to "Value2")

LazyColumn {
items(map.entries.toList()) { entry ->
Text("Key: ${entry.key}, Value: ${entry.value}")
}
}

8. Combining Different Composables and Static Content

You can mix different composables and static content within the same LazyColumn.

LazyColumn {
item {
Text("Static Header")
}
items(messages) { msg ->
MessageCard(msg)
}
item {
Spacer(modifier = Modifier.height(16.dp))
}
item {
Text("Static Footer")
}
}

Full Example

Here’s a comprehensive example demonstrating several of these methods:

@Composable
fun Conversation() {
val messages = Message.messageList()
val headerMessages = listOf(Message("Header", "1"), Message("Header", "2"))
val footerMessages = listOf(Message("Footer", "1"), Message("Footer", "2"))
val itemCount = 5

LazyColumn {
// Static header
item {
Text("Static Header", style = MaterialTheme.typography.h6)
}

// Header messages
items(headerMessages) { msg ->
MessageCard(msg)
}

// Indexed messages
itemsIndexed(messages) { index, msg ->
Text("Item #$index")
MessageCard(msg)
}

// Custom item generation
items(itemCount) { index ->
Text("Generated Item #$index")
}

// Static footer
item {
Spacer(modifier = Modifier.height(16.dp))
Text("Static Footer", style = MaterialTheme.typography.h6)
}

// Footer messages
items(footerMessages) { msg ->
MessageCard(msg)
}
}
}

@Composable
fun MessageCard(msg: Message) {
Row(modifier = Modifier.padding(all = 8.dp)) {
Image(
painter = painterResource(R.drawable.ic_launcher_background),
contentDescription = "Contact profile picture",
modifier = Modifier
.size(40.dp)
.clip(CircleShape)
.border(1.5.dp, MaterialTheme.colorScheme.primary, CircleShape)
)
Spacer(modifier = Modifier.width(8.dp))
Column {
Text(
text = msg.fName,
color = MaterialTheme.colorScheme.primary,
style = MaterialTheme.typography.titleMedium
)
Spacer(modifier = Modifier.height(2.dp))
Text(
text = msg.lName,
style = MaterialTheme.typography.bodyMedium
)
}
}
}

This example showcases different ways to add items to a LazyColumn, including using static content, indexed items, custom item generation, and more.

--

--