Lazyrow crashes because of 'IndexOutOfBoundsException' android compsoe

2skhul33  于 2023-05-15  发布在  Android
关注(0)|答案(2)|浏览(120)

我使用了一个lazycolumn来显示一个照片列表。照片与其路径一起显示。尝试删除图像时出现问题。我在每个图像上都有一个按钮,当单击它时,它的路径将从photoList中删除。但是当我点击删除按钮时,照片列表被修改了,但是UI没有改变。如果此时滚动该行,应用程序将崩溃并显示错误消息“IndexOutOfBoundsException”。我想那是由于排不重组的缘故。是什么原因。我该如何修复?

Composable which call photoList

val photoList MutableList

onDeleteClick = { path ->
                photoList.remove(path)

            }
Photo row compsoable
LazyRow(
    modifier = Modifier
        .padding(vertical = 16.dp)
        .wrapContentHeight()
        .fillMaxWidth(),
    horizontalArrangement = Arrangement.spacedBy(16.dp),
    state = rememberLazyListState(),
    contentPadding = PaddingValues(horizontal = 16.dp)
    ) {
        items(photoList) { path ->
        ImageCard(path) {
        onDeleteClick(path)
    }
ImageCard
IconButton(
            onClick = { onDeleteClick(path) },
            modifier = Modifier.align(Alignment.TopEnd)
        ) {
            Icon(
                imageVector = Icons.Default.Delete,
                contentDescription = "Delete",
                tint = Color.White
            )
        }
jmp7cifd

jmp7cifd1#

问题可能是你的photoList没有被 Package 在一个会在更改时触发Composite重新组合的状态中:)
下面是一个示例代码,我将photoList Package 在remember结构中。这不是完全相同的代码,因为你没有真正提供完整的代码,所以我不得不即兴发挥,但希望,你会明白这一点:)

val photoList = remember {
    // Wrap your photo list data in a state so it can trigger recomposition
    mutableStateOf(List(20) { index -> "Index $index" })
}

LazyRow(
    modifier = Modifier.fillMaxWidth(),
    horizontalArrangement = Arrangement.spacedBy(16.dp),
    contentPadding = PaddingValues(horizontal = 16.dp)
) {
    items(photoList.value) { text ->
        Text(
            text = text,
            modifier = Modifier
                .clickable {
                    // Modify the state value, this will trigger recomposition
                    photoList.value = photoList.value.minus(text)
                }
        )
    }
}
3phpmpom

3phpmpom2#

在LazyColumn/LazyRow中,您必须在项目中添加唯一键,基于唯一键,只有特定项目才能得到更新。

LazyRow(
modifier = Modifier
    .padding(vertical = 16.dp)
    .wrapContentHeight()
    .fillMaxWidth(),
horizontalArrangement = Arrangement.spacedBy(16.dp),
state = rememberLazyListState(),
contentPadding = PaddingValues(horizontal = 16.dp)
) {
    items(photoList,key = { it -> it.yourUniqueId ) { path ->
    ImageCard(path) {
    onDeleteClick(path)
}

相关问题