๊นจ์•Œ ๊ฐœ๋… ๐Ÿ“‘/Android

[Android] Jetpack Compose - Lazy Column

interfacer_han 2024. 7. 22. 14:44

#1 Lazy Column

#1-1 ๊ฐœ์š”

 

๋ชฉ๋ก ๋ฐ ๊ทธ๋ฆฌ๋“œ  |  Jetpack Compose  |  Android Developers

์ด ํŽ˜์ด์ง€๋Š” Cloud Translation API๋ฅผ ํ†ตํ•ด ๋ฒˆ์—ญ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ชฉ๋ก ๋ฐ ๊ทธ๋ฆฌ๋“œ ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•ด ์ •๋ฆฌํ•˜๊ธฐ ๋‚ด ํ™˜๊ฒฝ์„ค์ •์„ ๊ธฐ์ค€์œผ๋กœ ์ฝ˜ํ…์ธ ๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ถ„๋ฅ˜ํ•˜์„ธ์š”. ๋งŽ์€ ์•ฑ์—์„œ ํ•ญ๋ชฉ์˜ ์ปฌ๋ ‰์…˜์„ ํ‘œ์‹œํ•ด

developer.android.com

Lazy lists๋Š” Jetpack Compose ๋ฒ„์ „์—์„œ์˜ RecyclerView๋‹ค. Lazy lists๋Š” ๊ฐ€๋กœ๋กœ ์•„์ดํ…œ์ด ์ •๋ ฌ๋˜๋Š” Lazy Row์™€ ์„ธ๋กœ๋กœ ์•„์ดํ…œ์ด ์ •๋ ฌ๋˜๋Š” Lazy Column์ด ์žˆ๋Š”๋ฐ, ์ฃผ๋กœ ํ›„์ž๊ฐ€ ์“ฐ์ธ๋‹ค. ๋ณธ ๊ฒŒ์‹œ๊ธ€์—์„œ Lazy Column์„ ๊ตฌํ˜„ํ•ด๋ณธ๋‹ค.

 

#1-2 ๊ตฌ์กฐ

LazyColumn {
    // Add a single item
    item {
        Text(text = "First item")
    }

    // Add 5 items
    items(5) { index ->
        Text(text = "Item: $index")
    }

    // ↑ ๋ฉ”์†Œ๋“œ ์˜ค๋ฒ„๋กœ๋”ฉ ๊ด€๊ณ„ ↓

    /* List<T> ํƒ€์ž…์„ ๋ฐ›๋Š” items
     * import androidx.compose.foundation.lazy.items ํ•„์š”
     */
    items(messages) { message ->
        MessageRow(message)
    }
}

LazyColumn ๋‚ด๋ถ€(LazyListScope)์—๋Š” item { ... } ๋ฐ items { ... }์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๊ฒŒ ๋์ด๋‹ค. ๊ธฐ์กด ์ „ํ†ต์ ์ธ ๋ฐฉ์‹์˜ RecyclerView์™€ ๋น„๊ตํ•˜๋ฉด ์–ด๋งˆ์–ด๋งˆํ•˜๊ฒŒ ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ๋‹ค. ์ฝ”๋“œ๋Š” ๊ฐ„๋‹จํ•˜์ง€๋งŒ, ๊ทธ (์ปดํ“จํŒ… ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์ž์› ์ ˆ์•ฝ์ด๋ผ๋Š”) ํšจ๊ณผ๋Š” ๋™์ผํ•˜๋‹ค. ์—ฌ๋‹ด์œผ๋กœ LazyColumn์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์Šคํฌ๋กค ๊ฐ€๋Šฅํ•˜๊ธฐ์— ๊ด€๋ จํ•œ Modifier ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

 

#2 Lazy Column ์‚ฌ์šฉ ์˜ˆ์‹œ

// package com.example.lazycolumn

import android.os.Bundle
import android.widget.Toast
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.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.platform.LocalContext
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.TextUnit
import androidx.compose.ui.unit.sp
import com.example.lazycolumn.ui.theme.LazyColumnTheme

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            LazyColumnTheme {
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colorScheme.background
                ) {
                    val list = ArrayList<String>()
                    for (i: Int in 1..20) {
                        list.add("$i")
                    }
                    val modifier = Modifier.fillMaxSize()
                    LazyColumnExample(list, modifier)
                }
            }
        }
    }
}

@Composable
fun LazyColumnExample(itemsParam: List<String>, modifierParam: Modifier = Modifier) {
    val context = LocalContext.current

    LazyColumn(
        modifier = modifierParam

    ) {
        items(itemsParam) {
            val modifier = Modifier.clickable {
                Toast.makeText(context, "Clicked item $it", Toast.LENGTH_SHORT).show()
            }
            TextExample("$it", modifier)
        }
    }
}

@Composable
fun TextExample(
    name: String,
    modifierParam: Modifier = Modifier,
    fontSizeParam: TextUnit = 40.sp
) {
    Text(
        text = "$name",
        modifier = modifierParam,
        fontSize = fontSizeParam,
        textAlign = TextAlign.Center
    )
}

20๊ฐœ์˜ ์•„์ดํ…œ์„ ์ฃผ์ž…์‹œ์ผฐ๊ณ  ๊ฐ ์•„์ดํ…œ์— Modifier.clickable()๋ฅผ ์ „๋‹ฌํ•ด (ํ† ์ŠคํŠธ ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•˜๋Š”) ํด๋ฆญ ๋™์ž‘์„ ๊ตฌํ˜„ํ–ˆ๋‹ค. ์—ฌ๊ธฐ์˜ Text()๋Š” ์ผ์ข…์˜ TextButton์ฒ˜๋Ÿผ ๋™์ž‘ํ•œ๋‹ค.

 

#3 ์ž‘๋™ ํ™•์ธ

 

#4 ์š”์•ฝ

LazyColumn์€ ์‰ฌ์šด RecyclerView๋‹ค.

 

#5 ์™„์„ฑ๋œ ์•ฑ

 

android-practice/jetpack-compose/LazyColumn at master · Kanmanemone/android-practice

Contribute to Kanmanemone/android-practice development by creating an account on GitHub.

github.com