반응형
items에 넣은 List의 해시값이 변해도 이미 그려놓은 리스트는 해시값이 변경된걸 모른다.
리컴포지션일 일어나게 하기 위해서는 items에 key값을 지정해줘서, 리스트가 변경될때 키값 변경이 감지되도록 해야한다.
items 함수를 살펴보자.
inline fun <T> LazyListScope.items(
items: List<T>,
noinline key: ((item: T) -> Any)? = null,
noinline contentType: (item: T) -> Any? = { null },
crossinline itemContent: @Composable LazyItemScope.(item: T) -> Unit
) = items(
count = items.size,
key = if (key != null) { index: Int -> key(items[index]) } else null,
contentType = { index: Int -> contentType(items[index]) }
) {
itemContent(items[it])
}
items 함수에서 Key값을 인자로 받는걸 알 수 있다.
/* Compose */
val tempList = remember { viewModel.tempList }
LazyColumn(modifier = Modifier.fillMaxHeight()) {
items(
items = tempList,
key = { temp -> temp.no} // key값 지정
) {
}
}
/* viewModel*/
var tempList = mutableStateListOf(Temp())
private set
// delete
tempList.remove(item)
// update
val position = tempList.indexOf(temp)
tempList[position] = temp.copy(flag = "Y")
items에 list와 key값을 넘겨주었다.
이제 list 안의 아이템을 delete, update 하면 주소값이 바뀌게 되어 변경값을 감지할 수 있다.
update 할때는 객체 자체를 변하게 하기 위해 copy한 후에 업데이트를 해주었다.
'IT > Android' 카테고리의 다른 글
Android / 안드로이드 notification Icon 적용 (0) | 2024.03.04 |
---|---|
Android / 푸시알림 클릭시 PendingIntent Bundle값 전달 안되는 경우 (0) | 2024.02.07 |
android / 안드로이드 webview에서 window.popup() 띄우기 (0) | 2023.11.16 |
android / 안드로이드 webview history back 화면 스크롤 유지 방법 (activity 이동) (0) | 2023.10.20 |
안드로이드 / image crop 라이브러리 사용 (0) | 2023.10.05 |