🚨 LazyColumn은 RecyclerView와 같은 하위 요소를 재활용하지 않는다.
컴포저블을 방출하는 것은 Android Views를 인스턴스화하는 것보다 상대적으로 비용이 적게 들므로 LazyColumn은 스크롤 할 때 새 컴포저블을 방출하고 계속 성능을 유지한다.
LazyColumn 적용 전 코드
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
.
.
.
@Composable
private fun Greetings(
modifier: Modifier = Modifier,
names: List<String> = listOf("World", "Compose")
) {
Column(modifier = modifier.padding(vertical = 4.dp)) {
for (name in names) {
Greeting(name = name)
}
}
}
LazyColumn 적용 후 코드
@Composable
private fun Greetings(
modifier: Modifier = Modifier,
names: List<String> = List(1000) { "$it" }
) {
LazyColumn(modifier = modifier.padding(vertical = 4.dp)) {
items(items = names) { name ->
Greeting(name = name)
}
}
}
위의 코드 중 LazyColumn 적용 전, 매개변수 names의 기본 목록 값을
names: List<String> = List(1000) { "$it" }
으로만 수정하였을 때 프리뷰에서 목록의 상태 반응 속도가 굉장히 느려졌었는데,
LazyColumn을 적용하니 다시 목록의 상태 반응 속도가 정상으로 돌아온 것을 느낄 수 있었다.

rememberSaveable 적용 전 코드
@Composable
fun MyApp(
modifier: Modifier = Modifier, // 빈 수정자가 할당되는 수정자 매개변수를 포함
) {
// by : = 대신 사용, 매번 .value를 입력할 필요가 없도록 해주는 속성
var shouldShowOnboarding by remember { mutableStateOf(true) }
Surface(modifier) {
if (shouldShowOnboarding) { // onBoarding이 보여질 때 (true일 때)
// OnboardingScreen 실행해 Button이 클릭되면 false로 바꿔주기
OnboardingScreen(onContinueClicked = {shouldShowOnboarding = false})
} else { // onBoarding이 보여지지 않을 때 (false일 때)
Greetings() // 다른 화면 출력
}
}
}
@Composable
fun Greeting(name: String, modifier: Modifier = Modifier) {
var expanded by remember { mutableStateOf(false) }
val extraPadding = if (expanded) 48.dp else 0.dp
Surface(
color = MaterialTheme.colorScheme.primary,
modifier = modifier.padding(vertical = 4.dp, horizontal = 8.dp)
) {
Row(modifier = Modifier.padding(24.dp)) {
Column(
modifier = Modifier
.weight(1f)
.padding(bottom = extraPadding)
) {
Text(text = "Hello")
Text(text = name)
}
ElevatedButton(
onClick = { expanded = !expanded },
) {
Text(if (expanded) "Show less" else "Show more")
}
}
}
}
rememberSaveable 적용 후 코드
@Composable
fun MyApp(
modifier: Modifier = Modifier, // 빈 수정자가 할당되는 수정자 매개변수를 포함
) {
// by : = 대신 사용, 매번 .value를 입력할 필요가 없도록 해주는 속성
var shouldShowOnboarding by rememberSaveable { mutableStateOf(true) }
Surface(modifier) {
if (shouldShowOnboarding) { // onBoarding이 보여질 때 (true일 때)
// OnboardingScreen 실행해 Button이 클릭되면 false로 바꿔주기
OnboardingScreen(onContinueClicked = {shouldShowOnboarding = false})
} else { // onBoarding이 보여지지 않을 때 (false일 때)
Greetings() // 다른 화면 출력
}
}
}
@Composable
fun Greeting(name: String, modifier: Modifier = Modifier) {
var expanded by rememberSaveable { mutableStateOf(false) }
val extraPadding = if (expanded) 48.dp else 0.dp
Surface(
color = MaterialTheme.colorScheme.primary,
modifier = modifier.padding(vertical = 4.dp, horizontal = 8.dp)
) {
Row(modifier = Modifier.padding(24.dp)) {
Column(
modifier = Modifier
.weight(1f)
.padding(bottom = extraPadding)
) {
Text(text = "Hello")
Text(text = name)
}
ElevatedButton(
onClick = { expanded = !expanded },
) {
Text(if (expanded) "Show less" else "Show more")
}
}
}
}

animateDpAsState 추가 전 코드
@Composable
fun Greeting(name: String, modifier: Modifier = Modifier) {
var expanded by rememberSaveable { mutableStateOf(false) }
val extraPadding = if (expanded) 48.dp else 0.dp
Surface(
color = MaterialTheme.colorScheme.primary,
modifier = modifier.padding(vertical = 4.dp, horizontal = 8.dp)
) {
Row(modifier = Modifier.padding(24.dp)) {
Column(
modifier = Modifier
.weight(1f)
.padding(bottom = extraPadding)
) {
Text(text = "Hello")
Text(text = name)
}
ElevatedButton(
onClick = { expanded = !expanded },
) {
Text(if (expanded) "Show less" else "Show more")
}
}
}
}
animateDpAsState 추가 후 코드
@Composable
fun Greeting(name: String, modifier: Modifier = Modifier) {
var expanded by rememberSaveable { mutableStateOf(false) }
val extraPadding by animateDpAsState(
if (expanded) 48.dp else 0.dp,
animationSpec = spring(
dampingRatio = Spring.DampingRatioMediumBouncy,
stiffness = Spring.StiffnessLow
), label = "padding"
)
Surface(
color = MaterialTheme.colorScheme.primary,
modifier = modifier.padding(vertical = 4.dp, horizontal = 8.dp)
) {
Row(modifier = Modifier.padding(24.dp)) {
Column(
modifier = Modifier
.weight(1f)
.padding(bottom = extraPadding.coerceAtLeast(0.dp))
) {
Text(text = "Hello")
Text(text = name)
}
ElevatedButton(
onClick = { expanded = !expanded },
) {
Text(if (expanded) "Show less" else "Show more")
}
}
}
}
