LazyRow у Jetpack Compose — шта је то, својства и како ради

Аутор: IT Sectr Објављено: 2026-06-29 Време читања: 10 мин

LazyRow — је composable функција у Jetpack Compose за креирање хоризонталних листи са лењим учитавањем елемената. За разлику од Row, LazyRow креира само видљиве елементе и поново их користи при хоризонталном померању. Према Google Android Documentation, 2025, LazyRow је хоризонтални еквивалент LazyColumn и ефикасан је за каруселе, галерије и хоризонталне меније у мобилним апликацијама.

Главне ствари

  • LazyRow — хоризонтална листа Jetpack Compose са лењим учитавањем, која креира само видљиве елементе приликом хоризонталног померања.
  • horizontalArrangement управља распоредом елемената по хоризонтали, а contentPadding додаје размаке на ивицама контејнера.
  • LazyListState прати позицију хоризонталног померања и обезбеђује програмско управљање кроз animateScrollToItem.
  • LazyRow је ефикасан за каруселе слика, листе категорија, хоризонталне галерије и картице у мобилним интерфејсима.
  • contentType и key оптимизују поновно коришћење елемената LazyRow, смањујући рекомпозицију при померању.

Шта је LazyRow у Jetpack Compose

LazyRow — је composable функција која имплементира хоризонталну листу која се помера са лењим учитавањем елемената. За разлику од Row, који приказује све подређене елементе истовремено, LazyRow креира само елементе видљиве у области приказа.

LazyRow ради по истом принципу као LazyColumn, али распоређује елементе хоризонтално. При померању улево или удесно, елементи који су изашли из видљиве области се поново користе за приказ нових. Ово је критично важно за галерије са великим бројем слика или дугачке листе категорија.

Према Android Developers Blog, 2024, LazyRow користи исту LazyList архитектуру као LazyColumn, укључујући LazyListState, механизам поновног коришћења кроз Pool и подршку за различите типове елемената. Максимална ефикасност се постиже коришћењем фиксне висине елемената.

Основна сигнатура LazyRow

LazyRow прихвата параметре modifier, state, contentPadding, reverseLayout, horizontalArrangement и verticalAlignment. Садржај се дефинише кроз DSL функције items и item, слично LazyColumn.

kotlin
@Composable
fun SimpleLazyRow() {
    val items = (1..50).toList()
    LazyRow(
        modifier = Modifier.fillMaxWidth().height(100.dp),
        horizontalArrangement = Arrangement.spacedBy(8.dp),
        contentPadding = PaddingValues(start = 16.dp, end = 16.dp)
    ) {
        items(items) { item ->
            Box(
                modifier = Modifier.size(80.dp).background(Color.Gray)
            ) {
                Text(text = "$item", modifier = Modifier.align(Alignment.Center))
            }
        }
    }
}

Својства LazyRow: horizontalArrangement и contentPadding

horizontalArrangement управља расподелом елемената дуж хоризонталне осе унутар LazyRow. Доступне су исте вредности Arrangement као у Row: Start, Center, End, SpaceBetween, SpaceEvenly, SpaceAround и spacedBy са прилагођеним размаком.

contentPadding додаје размаке на ивицама контејнера LazyRow. За разлику од Modifier.padding, contentPadding се узима у обзир при померању: први елемент ће имати размак од леве ивице, последњи — од десне. Према Material Design Guidelines, 2025, contentPadding је обавезан за каруселе и галерије како се први и последњи елемент не би лепили за ивицу екрана.

verticalAlignment поравнава елементе вертикално унутар LazyRow. Подразумевано се користи Alignment.Top. За центрирање елемената различитих висина користите Alignment.CenterVertically, што је корисно за каруселе са сликама различитих пропорција.

Табела параметара LazyRow

ПараметарОписПодразумевана вредност
horizontalArrangementРасподела елемената по хоризонталиArrangement.Start
contentPaddingРазмаци на ивицама контејнераPaddingValues(0.dp)
verticalAlignmentВертикално поравнањеAlignment.Top
reverseLayoutОбрнути редослед елеменатаfalse
userScrollEnabledДозвола померања од стране корисникаtrue

Управљање хоризонталним померањем са LazyListState

LazyListState за LazyRow ради идентично као за LazyColumn: прати први видљиви елемент, померај и општу позицију померања. Стање се креира кроз rememberLazyListState() и прослеђује у параметру state.

Програмско управљање померањем LazyRow се врши истим методама: animateScrollToItem за глатку анимацију и scrollToItem за тренутно померање. Обе се позивају унутар корутине. Ово је корисно за каруселе са дугмадима „Лево/Десно" или за аутоматско померање.

Према Android Developers, 2024, LazyRow такође подржава SnapFlingBehavior — понашање при наглом померању које се зауставља на најближем елементу, а не између елемената. Ово ствара ефекат „лепљења" за елемент, познат из карусела и галерија.

kotlin
@Composable
fun CarouselWithSnap() {
    val listState = rememberLazyListState()
    val scope = rememberCoroutineScope()
    val items = listOf("A", "B", "C", "D", "E")

    Column {
        LazyRow(
            state = listState,
            flingBehavior = SnapFlingBehavior(listState),
            horizontalArrangement = Arrangement.spacedBy(8.dp)
        ) {
            items(items) { item ->
                Card(modifier = Modifier.width(150.dp)) {
                    Text(text = item, modifier = Modifier.padding(16.dp))
                }
            }
        }

        Row(modifier = Modifier.fillMaxWidth()) {
            Button(onClick = {
                scope.launch {
                    listState.animateScrollToItem(0)
                }
            }) { Text("Да бисте започели") }
        }
    }
}

Примери коришћења LazyRow у интерфејсима

Први пример — LazyRow за галерију слика са прегледима. Сваки елемент представља Box са сликом и описом. LazyRow ефикасно обрађује десетине и стотине слика, учитавајући само видљиве.

kotlin
@Composable
fun ImageGallery(images: List<String>) {
    LazyRow(
        contentPadding = PaddingValues(start = 16.dp, end = 16.dp),
        horizontalArrangement = Arrangement.spacedBy(12.dp)
    ) {
        items(images, key = { it }) { url ->
            AsyncImage(
                model = url,
                contentDescription = "Image",
                modifier = Modifier.size(120.dp)
            )
        }
    }
}

Други пример — LazyRow за листу категорија са иконицама. Категорије се приказују у облику чипова, а корисник их може померати хоризонтално. LazyRow са spacedBy и contentPadding ствара размаке између категорија и на ивицама.

kotlin
@Composable
fun CategoryChips(categories: List<String>) {
    LazyRow(
        contentPadding = PaddingValues(horizontal = 16.dp),
        horizontalArrangement = Arrangement.spacedBy(8.dp)
    ) {
        items(categories, key = { it }) { category ->
            AssistChip(
                onClick = {},
                label = { Text(category) }
            )
        }
    }
}

LazyRow против Row: када шта изабрати

Избор између LazyRow и Row зависи од броја елемената. Row је погодан за 5–10 елемената који су увек видљиви на екрану. LazyRow је обавезан када је елемената много или је њихов број динамичан.

Row приказује све елементе одједном, што доводи до кашњења при великом броју елемената. LazyRow приказује само видљиве, што га чини пожељним за листе са померањем. Према Android Developers Blog, 2024, праг преласка је приближно 10 елемената: ако их је више, користите LazyRow.

LazyRow такође подржава анимације, SnapFlingBehavior и груписање кроз раздвајаче, што га чини флексибилнијим за сложене интерфејсе. Row је једноставнији и не захтева LazyListState, али није оптимизован за дугачке листе.

  • Row — за 5–10 статичких елемената без померања
  • LazyRow — за 10+ елемената са хоризонталним померањем
  • LazyRow — за каруселе, галерије, динамичке листе

Често постављана питања

Чим се LazyRow разликује од LazyColumn?

LazyRow се помера хоризонтално и распоређује елементе слева надесно, а LazyColumn — вертикално одозго надоле. Оба користе исте принципе лењог учитавања, LazyListState и DSL функције items.

Како додати SnapFlingBehavior у LazyRow?

Проследите SnapFlingBehavior(listState) у параметар flingBehavior LazyRow. SnapFlingBehaviour чини да се LazyRow зауставља на најближем елементу, а не између елемената, што ствара ефекат лепљења за каруселе.

Како направити LazyRow са бесконачним померањем?

Пратите последњи видљиви елемент кроз LazyListState.layoutInfo и учитавајте нове податке када се последњи елемент приближи крају листе. За циклично померање користите прилагођену имплементацију са дуплирањем елемената.

Може ли се LazyRow користити унутар LazyColumn?

Да, LazyRow се може уметнути у LazyColumn. Ово је стандардни образац за креирање сложених страница са хоризонталним каруселима унутар вертикалне листе. Сваки LazyRow треба да има фиксну висину за исправан рад.

Како одредити да је LazyRow померен до краја?

Користите LazyListState.layoutInfo.visibleItemsInfo и упоредите индекс последњег видљивог елемента са укупним бројем минус један. Када се ове вредности поклопе, LazyRow је на крају листе.

Резиме

  • LazyRow — хоризонтална листа са лењим учитавањем, која креира само видљиве елементе и поново их користи при померању за ефикасан рад са великим подацима.
  • horizontalArrangement управља расподелом елемената по хоризонтали, а contentPadding додаје размаке на ивицама за исправан приказ у Material Design.
  • LazyListState обезбеђује програмско управљање померањем кроз animateScrollToItem и подржава SnapFlingBehavior за лепљење за елементе.
  • LazyRow је ефикасан за каруселе слика, галерије, листе категорија, картице и хоризонталне меније у мобилним интерфејсима.
  • contentType и key — главни алати за оптимизацију, смањујући рекомпозицију и побољшавајући поновно коришћење елемената LazyRow.
  • Row је погодан за 5–10 статичких елемената, LazyRow — за динамичке или дугачке хоризонталне листе са померањем.
  • LazyRow се може уметнути у LazyColumn за креирање сложених распореда са хоризонталним каруселима унутар вертикалне листе.

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође