본문 바로가기
안드로이드 코틀린

[Kotlin][Android] Jetpack Compose 클릭한 아이템 개수 실시간 업데이트하기

by teamnova 2024. 10. 3.
728x90

 

안녕하세요 오늘은 지난번 컴포즈를 사용해 체크박스를 만들어보았는데요 

오늘은 체크된 아이템 개수를 동적으로 변경하는 텍스트뷰를 추가해보도록 하겠습니다 

 

안드로이드 컴포즈로 체크 박스 만들기는 아래 링크에서 확인하실 수 있습니다 

https://stickode.tistory.com/1309

 

[Kotlin][Android] Jetpack Compose 체크 박스 만들기

안녕하세요 오늘은 Jetpack Compose 를 사용하여 목록 아이템에 체크 박스를 추가해보도록 하겠습니다  LazyColumn 는 간편하게 목록을 만들 수 있는 Jetpack Compose 의 구성 요소 중 하나 입니다기존 리

stickode.tistory.com

 

 

목록에서 아이템의 선택 상태가 변경되면

선택된 아이템 개수 변수인 selectedCount 에 업데이트 됩니다 

// 체크 박스 상태 리스트
val selectedItems = remember { mutableStateListOf<Boolean>().apply { repeat(cnt) { add(false) } } }

// 선택된 아이템 개수를 계산
val selectedCount by remember { derivedStateOf { selectedItems.count { it } } }

Column {
    // 1) 선택된 아이템 개수를 표시
    Text(
        text = "선택된 아이템 : $selectedCount",
        modifier = Modifier
            .fillMaxWidth()
            .padding(16.dp),
        color = Color.Blue
    )

    // 2) 체크박스 리스트 표시
    LazyColumn {
        items(items) { item ->
            val index = items.indexOf(item)

            Row(
                modifier = Modifier
                    .fillMaxWidth()
                    .padding(vertical = 8.dp)
                    .clickable {
                        selectedItems[index] = !selectedItems[index] // 체크박스 상태 토글
                    }
                    .padding(16.dp),
                verticalAlignment = Alignment.CenterVertically
            ) {
                Checkbox(
                    checked = selectedItems[index],
                    onCheckedChange = { checked -> selectedItems[index] = checked }
                )
                Text(
                    text = item,
                    color = Color.Black,
                    modifier = Modifier.padding(start = 16.dp)
                )
            }
        }
    }

 

 

 

아래는 전체 코드 입니다 

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            Kotlin_exampleTheme {
                // A surface container using the 'background' color from the theme
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colorScheme.background
                ) {
                    ItemList(cnt = 100)
                }
            }
        }
    }
}

// item list
@Composable
fun ItemList(cnt: Int) {
    val items = List(cnt) { "Item ${it + 1}" }

    // 체크 박스 상태 리스트
    val selectedItems = remember { mutableStateListOf<Boolean>().apply { repeat(cnt) { add(false) } } }

    // 선택된 아이템 개수를 계산
    val selectedCount by remember { derivedStateOf { selectedItems.count { it } } }

    Column {
        // 1) 선택된 아이템 개수를 표시
        Text(
            text = "선택된 아이템 : $selectedCount",
            modifier = Modifier
                .fillMaxWidth()
                .padding(16.dp),
            color = Color.Blue
        )

        // 2) 체크박스 리스트 표시
        LazyColumn {
            items(items) { item ->
                val index = items.indexOf(item)

                Row(
                    modifier = Modifier
                        .fillMaxWidth()
                        .padding(vertical = 8.dp)
                        .clickable {
                            selectedItems[index] = !selectedItems[index] // 체크박스 상태 토글
                        }
                        .padding(16.dp),
                    verticalAlignment = Alignment.CenterVertically
                ) {
                    Checkbox(
                        checked = selectedItems[index],
                        onCheckedChange = { checked -> selectedItems[index] = checked }
                    )
                    Text(
                        text = item,
                        color = Color.Black,
                        modifier = Modifier.padding(start = 16.dp)
                    )
                }
            }
        }
    }
}

@Preview(showBackground = true)
@Composable
fun GreetingPreview() {
    Kotlin_exampleTheme {
        ItemList(cnt = 100)
    }
}

 

 

 


시연 영상입니다 

 

 

 

다음시간에는 아이템 목록을 직접 추가하고 삭제해보도록 하겠습니다 

감사합니다