LazyGrid helps you show many items in a grid without slowing down your app. It only creates items you see on the screen, saving memory and making scrolling smooth.
LazyGrid in Android Kotlin
LazyVerticalGrid(
columns = GridCells.Fixed(2),
content = {
items(yourList) { item ->
// Your item UI here
}
}
)LazyVerticalGrid creates a vertical scrolling grid.
GridCells.Fixed(2) means 2 columns in the grid.
LazyVerticalGrid(
columns = GridCells.Fixed(3),
content = {
items(10) { index ->
Text("Item #$index")
}
}
)LazyVerticalGrid(
columns = GridCells.Adaptive(minSize = 100.dp),
content = {
items(listOf("A", "B", "C")) { letter ->
Text(letter)
}
}
)This example shows a simple grid with 2 columns displaying fruit names. Each fruit name has padding around it for spacing.
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.grid.GridCells import androidx.compose.foundation.lazy.grid.LazyVerticalGrid import androidx.compose.foundation.lazy.grid.items import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp @Composable fun SimpleLazyGrid() { val fruits = listOf("Apple", "Banana", "Cherry", "Date", "Elderberry", "Fig") LazyVerticalGrid( columns = GridCells.Fixed(2), modifier = Modifier.padding(16.dp) ) { items(fruits) { fruit -> Text( text = fruit, modifier = Modifier.padding(8.dp), style = MaterialTheme.typography.bodyLarge ) } } }
LazyGrid only creates items visible on screen, so it works well with large lists.
You can choose fixed columns or adaptive columns that change based on screen size.
Use padding and spacing modifiers to make your grid look neat and readable.
LazyGrid shows items in a grid efficiently by creating only visible items.
You can set fixed or adaptive columns to control grid layout.
It is great for photo galleries, product lists, or any grid-based UI.
Practice
LazyVerticalGrid in Android Compose?Solution
Step 1: Understand LazyVerticalGrid behavior
LazyVerticalGrid creates only the visible grid items to save memory and improve performance.Step 2: Compare with other options
Options A and B describe different layouts, and D is inefficient because it loads all items at once.Final Answer:
To efficiently display a scrollable grid of items by creating only visible items -> Option AQuick Check:
LazyGrid creates visible items only = C [OK]
- Thinking LazyGrid loads all items at once
- Confusing LazyGrid with a simple vertical list
- Assuming LazyGrid fixes number of buttons only
Solution
Step 1: Recall syntax for fixed columns
The correct syntax uses GridCells.Fixed with an integer number of columns.Step 2: Analyze each option
LazyVerticalGrid(columns = GridCells.Fixed(3)) { /* items */ } uses GridCells.Fixed(3) correctly. LazyVerticalGrid(columns = GridCells.Adaptive(100.dp)) { /* items */ } uses adaptive columns, not fixed. LazyVerticalGrid(columns = 3) { /* items */ } passes an integer directly, which is invalid. LazyVerticalGrid(columns = GridCells.Fixed("3")) { /* items */ } passes a string instead of an integer.Final Answer:
LazyVerticalGrid(columns = GridCells.Fixed(3)) { /* items */ } -> Option BQuick Check:
Fixed columns use GridCells.Fixed(number) = D [OK]
- Passing integer directly instead of GridCells.Fixed
- Using string instead of integer for column count
- Confusing fixed with adaptive columns
LazyVerticalGrid(columns = GridCells.Fixed(2)) {
items(4) { index ->
Text(text = "Item $index")
}
}How many columns and rows will be visible if the grid shows all items?
Solution
Step 1: Understand columns and items
The grid has 2 fixed columns and 4 items total.Step 2: Calculate rows needed
With 2 columns, 4 items fill 2 rows (2 items per row).Final Answer:
2 columns and 2 rows -> Option AQuick Check:
4 items / 2 columns = 2 rows [OK]
- Assuming columns equal number of items
- Confusing rows and columns count
- Ignoring fixed columns setting
LazyVerticalGrid(columns = GridCells.Fixed(3)) {
items(5) { index ->
Text(text = "Item $index")
}
item {
Text(text = "Footer")
}
}Solution
Step 1: Check usage of items and item
LazyVerticalGrid supports both items (multiple) and item (single) blocks for content.Step 2: Verify GridCells.Fixed usage
GridCells.Fixed(3) is valid to set 3 columns.Final Answer:
No error; code is correct -> Option CQuick Check:
items and item can coexist = B [OK]
- Thinking item block must be inside items
- Assuming GridCells.Fixed(3) is invalid
- Believing multiple content blocks cause error
Solution
Step 1: Understand adaptive columns
GridCells.Adaptive sets columns based on minimum item size, adapting to screen width.Step 2: Match requirement to code
LazyVerticalGrid(columns = GridCells.Adaptive(120.dp)) { /* images */ } uses GridCells.Adaptive(120.dp), which fits the requirement of minimum 120.dp per item and adapts columns.Final Answer:
LazyVerticalGrid(columns = GridCells.Adaptive(120.dp)) { /* images */ } -> Option DQuick Check:
Adaptive columns use minimum size = A [OK]
- Using Fixed with pixel count instead of dp
- Confusing number of columns with minimum size
- Using Adaptive with integer instead of dp
Ready to prove it?
Pass the test and this pattern moves unknown
