RecyclerView와 동일한 것이 바로 LazyColumn과 LazyRow 다.
세로 리사이클러뷰 안에 가로 리사이클러뷰를 넣으면서 클릭 이벤트 등 골치를 썩였는데, 컴포즈를 쓰면 아주 간단해질 것 같다.
//
@Composable
private fun Greetings(
modifier: Modifier = Modifier,
names: List<String> = List(1000) { "$it" }
) {
LazyColumn(modifier = modifier.padding(vertical = 4.dp)) {
items(names) {
Greeting(it)
}
}
}
참고: import 할 때 Android 스튜디오는 기본적으로 다른 items 함수를 선택하므로 androidx.compose.foundation.lazy.items를 가져와야 함.
참고: LazyColumn은 RecyclerView와 같은 하위 요소를 재활용하지 않습니다. 컴포저블을 방출하는 것은 Android Views를 인스턴스화하는 것보다 상대적으로 비용이 적게 들므로 LazyColumn은 스크롤 할 때 새 컴포저블을 방출하고 계속 성능을 유지합니다.
...는 무슨 말인지 모르겠다.
화면을 회전시키거나 LazyColumn에서 스크롤해서 안보이게 해놓고 돌아가면 상태가 리셋되는 문제가 있다.
remember 함수는 컴포저블이 컴포지션에 유지되는 동안에만 작동하기 때문.
rememberSaveable을 사용하면 된다.
이외에 animateDpAsState 델리게이트와 animationSpec 매개변수를 사용하면 영역 늘어나는 애니메이션을 쉽게 만들 수 있다.
각 컴포저블마다 style 을 사용해서 테마를 지정할 수도 있고, 테마에서 .copy하여 일부분을 바꿀 수도 있다.
@Preview에 uiMode = UI_MODE_NIGHT_YES 추가하면 다크모드 미리보기도 추가됨.
implementation("androidx.compose.material:material-icons-extended")
추가해놓고 Icons.Filled.ExpandLess, 혹은 ExpandMore 등의 아이콘을 사용할 수 있다.
Card 안에 넣으면 둥근 테두리를 추가할 수 있다.
(containerColor로 색을 지정해줘야 보임. 내부 배경색이랑 맞춰줘야 하는 문제가 있음.)
(Surface에서도 둥근 테두리를 추가할 수 있는 듯.)
컴포저블은 흥미로운 부분이 많은 것 같다. 아직 알아갈 부분이 많다.