[Compose] LazyListScope

 

RecyclerView 대신 Compose에서는 Lazy Lists를 사용합니다.

LazyColumn, LazyRow, LazyGrid는 대량의 데이터를 효율적으로 표시하는 데 특화된 컴포넌트입니다.

 

LazyListScope

LazyListScopeLazyColumnLazyRow에서 항목을 정의할 때 사용하는 DSL(도메인 특정 언어)입니다.

스코프는 리스트의 항목을 추가하고 구성할 수 있는 다양한 함수들을 제공합니다.

이를 통해 코드의 가독성을 높이고, 리스트 항목을 더 쉽게 관리할 수 있습니다.

 

@LazyScopeMarker
@JvmDefaultWithCompatibility
interface LazyListScope {
    fun item(
        key: Any? = null,
        contentType: Any? = null,
        content: @Composable LazyItemScope.() -> Unit
    ) {
        error("The method is not implemented")
    }

    fun items(
        count: Int,
        key: ((index: Int) -> Any)? = null,
        contentType: (index: Int) -> Any? = { null },
        itemContent: @Composable LazyItemScope.(index: Int) -> Unit
    ) {
        error("The method is not implemented")
    }
		
   @ExperimentalFoundationApi
    fun stickyHeader(
        key: Any? = null,
        contentType: Any? = null,
        content: @Composable LazyItemScope.() -> Unit
    )
}

 

LazyListScope는 다음과 같은 기능을 제공합니다.

 

items

리스트 항목을 정의합니다.

데이터 리스트를 전달하고, 각 항목을 어떻게 표시할 지 지정합니다.

items(yourDataList) { item ->
    Text(text = item)
}

 

item

이 함수는 특정 항목을 추가할 때 사용합니다.

item {
    Text(text = "Header", fontWeight = FontWeight.Bold)
}

 

itemsIndexed

각 항목의 인덱스를 함께 사용할 수 있습니다.

이 기능은 항목의 순서난 위치에 따라 다르게 표시할 때 유용합니다.

itemsIndexed(yourDataList) { index, item ->
    Text(text = "$index: $item")
}

 

LazyColumn() {
    itemsIndexed(
        items = books,
        key = { index, book ->
            book.id
        }
    ) { index, book ->
        Log.d("TEST", index.toString())
    }
}

DiffUtil 처럼 LazyColumn, LazyRow에서도 key 파라미터를 통해 각 아이템의 고유 키를 설정하여 값 변경 시 해당하는 데이터만 Recomposition하도록 할 수 있습니다.

 

stickyHeader

스크롤 시 고정되는 헤더를 추가할 수 있습니다.

이 기능은 섹션 헤더 등을 만들 때 유용합니다.

stickyHeader {
    Text(text = "Sticky Header", fontSize = 20.sp, fontWeight = FontWeight.Bold)
}

 

data class Item(val id: Int, val name: String, val category: String)

val itemsList = listOf(
    Item(1, "Apple", "Fruit"),
    Item(2, "Banana", "Fruit"),
    Item(3, "Carrot", "Vegetable"),
    Item(4, "Broccoli", "Vegetable"),
    Item(5, "Chicken", "Meat"),
    Item(6, "Beef", "Meat"),
)

@Composable
fun StickyHeaderLazyColumn() {
    LazyColumn {
        items(itemsList.groupBy { it.category }.toList()) { (category, items) ->
            stickyHeader {
                Text(text = category)
            }
            items(items) { item ->
                Text(text = item.name)
            }
        }
    }
}

'[Android - Compose] > Compose' 카테고리의 다른 글

[Compose] Android Composable Lifecycle  (0) 2024.09.08
[Compose] Slot-based Layouts  (0) 2024.09.06
[Compose] BottomNavigation 사용방법  (0) 2024.09.06
[Compose] State Hoisting  (0) 2024.09.05
Android Jetpack Compose 이해하기  (0) 2024.09.05