Wed. Jan 15th, 2025

In Jetpack Compose, the equivalent of the traditional RecyclerView is LazyColumn (for vertical scrolling) and LazyRow (for horizontal scrolling). These composables are designed to handle large data sets efficiently, with only the visible items being composed (lazy loading).


1. LazyColumn: Vertical List

Use LazyColumn when you need a vertically scrolling list.

Example: Basic LazyColumn

import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp

@Composable
fun SimpleRecyclerView() {
    val itemsList = List(20) { "Item $it" }

    LazyColumn(modifier = Modifier.padding(16.dp)) {
        items(itemsList) { item ->
            Text(
                text = item,
                modifier = Modifier.padding(8.dp)
            )
        }
    }
}

2. LazyRow: Horizontal List

Use LazyRow for horizontally scrolling lists.

Example: Basic LazyRow

import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyRow
import androidx.compose.foundation.lazy.items
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp

@Composable
fun HorizontalRecyclerView() {
    val itemsList = List(20) { "Item $it" }

    LazyRow(modifier = Modifier.padding(16.dp)) {
        items(itemsList) { item ->
            Text(
                text = item,
                modifier = Modifier.padding(horizontal = 8.dp)
            )
        }
    }
}

3. Custom Item Layout

You can define custom layouts for each item in the list.

Example: Custom Item Design

import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Card
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp

@Composable
fun CustomRecyclerView() {
    val itemsList = List(10) { "Item $it" }

    LazyColumn(modifier = Modifier.padding(16.dp)) {
        items(itemsList) { item ->
            Card(
                shape = RoundedCornerShape(8.dp),
                modifier = Modifier
                    .fillMaxWidth()
                    .padding(8.dp),
                backgroundColor = Color.LightGray
            ) {
                Row(
                    verticalAlignment = Alignment.CenterVertically,
                    modifier = Modifier
                        .fillMaxWidth()
                        .padding(16.dp)
                ) {
                    Text(text = item)
                }
            }
        }
    }
}

4. Grid Layout

For grid layouts, use LazyVerticalGrid (as described earlier).


5. Efficient Updates with Keys

To efficiently handle item animations or updates in a list, use the key parameter.

Example: Using Keys

LazyColumn {
    items(itemsList, key = { it.id }) { item ->
        Text(text = item.name)
    }
}

6. Handling Large Data Sets

For very large lists, Jetpack Compose inherently optimizes memory usage by lazily composing items. However, you can integrate it with the Paging 3 Library for smooth data loading.

Example: Paging with LazyColumn

val lazyPagingItems = pager.flow.collectAsLazyPagingItems()

LazyColumn {
    items(lazyPagingItems) { item ->
        item?.let {
            Text(text = it.name)
        }
    }
}

Advantages of LazyColumn Over RecyclerView

  1. Declarative UI: Simplifies list creation without requiring adapters or ViewHolders.
  2. Efficient: Only visible items are composed, optimizing performance.
  3. Customization: Easily customize item layouts and list behaviors.
  4. Animations: Built-in support for list animations like adding or removing items.

In Jetpack Compose, LazyColumn and LazyRow provide all the functionality you need to replace RecyclerView in a modern, declarative way.

By Rajashekar

I’m (Rajashekar) a core Android developer with complimenting skills as a web developer from India. I cherish taking up complex problems and turning them into beautiful interfaces. My love for decrypting the logic and structure of coding keeps me pushing towards writing elegant and proficient code, whether it is Android, PHP, Flutter or any other platforms. You would find me involved in cuisines, reading, travelling during my leisure hours.

Leave a Reply

Your email address will not be published. Required fields are marked *