jetpack compose lazycolumn items not shows deleted only after scroll

426 Views Asked by At

Could you pelase help me?

I want to use swipe to delete and tried a lot of things, but nothing works good. The best way is:

            items(listactivity.size) { index ->
                val activityItem = listactivity.getOrNull(index)

                if (activityItem != null) {
                    key(activityItem) {

                        val dismissState = rememberDismissState()
                        LaunchedEffect(dismissState.currentValue) {
                            if (dismissState.currentValue == DismissValue.DismissedToStart) {
                                dashboardViewModel.activityForDelete = activityItem
                                println("ACT ITEM " + activityItem.activityType?.activityTypeName)
                                visibleDeleteDialog.value = true
                                dismissState.snapTo(DismissValue.Default)
                            }
                        }

                        if (visibleDeleteDialog.value) {
                            BaseAlertDialog(
                                onExit = {
                                    visibleDeleteDialog.value = false
                                },
                                onSuccess = {
                                    removeActivity()
                                    visibleDeleteDialog.value = false
                                },
                                disclaimerFirst = R.string.confirm_delete_activity,
                                disclaimerSecond = R.string.confirm_delete_activity_text,
                                successName = R.string.delete_session
                            )
                        }

                        SwipeToDismiss(
                            state = dismissState,
                            directions = setOf(DismissDirection.EndToStart),
                            background = {
                                val direction =
                                    dismissState.dismissDirection ?: return@SwipeToDismiss

                                val alignment = when (direction) {
                                    DismissDirection.StartToEnd -> Alignment.CenterStart
                                    DismissDirection.EndToStart -> CenterEnd
                                }

                                Box(
                                    modifier = Modifier
                                        .fillMaxSize()
                                        .background(Black)
                                        .padding(horizontal = Spacing_12),
                                    contentAlignment = alignment
                                ) {
                                    Text(
                                        text = stringResource(id = R.string.delete),
                                        color = Color.Red,
                                        fontSize = Text_16,
                                        fontWeight = FontWeight.Bold
                                    )
                                }
                            },
                            dismissContent = {
                                GameCard(activityItem)
                            }
                        )

                    }
                }

            }

However th lisitem do not update items after delete immidiately (only after scroll i can see what item was deleted).

What am i doing wrong?

I tried SwipeToDismiss and other internet things.

1

There are 1 best solutions below

4
On

I know google has a bug in this function items() some times,

but please try to replace your function with itemsIndexed and add another parameter

itemsIndexed(listactivity.size) { index , item ->

something like this


// import this at the top
import androidx.compose.foundation.lazy.itemsIndexed

//code
//*
//*
//*


itemsIndexed(listactivity.size) { index , item ->
                val activityItem = listactivity.getOrNull(index)

                if (activityItem != null) {
                    key(activityItem) {

                        val dismissState = rememberDismissState()
                        LaunchedEffect(dismissState.currentValue) {
                            if (dismissState.currentValue == DismissValue.DismissedToStart) {
                                dashboardViewModel.activityForDelete = activityItem
                                println("ACT ITEM " + activityItem.activityType?.activityTypeName)
                                visibleDeleteDialog.value = true
                                dismissState.snapTo(DismissValue.Default)
                            }
                        }

                        if (visibleDeleteDialog.value) {
                            BaseAlertDialog(
                                onExit = {
                                    visibleDeleteDialog.value = false
                                },
                                onSuccess = {
                                    removeActivity()
                                    visibleDeleteDialog.value = false
                                },
                                disclaimerFirst = R.string.confirm_delete_activity,
                                disclaimerSecond = R.string.confirm_delete_activity_text,
                                successName = R.string.delete_session
                            )
                        }

                        SwipeToDismiss(
                            state = dismissState,
                            directions = setOf(DismissDirection.EndToStart),
                            background = {
                                val direction =
                                    dismissState.dismissDirection ?: return@SwipeToDismiss

                                val alignment = when (direction) {
                                    DismissDirection.StartToEnd -> Alignment.CenterStart
                                    DismissDirection.EndToStart -> CenterEnd
                                }

                                Box(
                                    modifier = Modifier
                                        .fillMaxSize()
                                        .background(Black)
                                        .padding(horizontal = Spacing_12),
                                    contentAlignment = alignment
                                ) {
                                    Text(
                                        text = stringResource(id = R.string.delete),
                                        color = Color.Red,
                                        fontSize = Text_16,
                                        fontWeight = FontWeight.Bold
                                    )
                                }
                            },
                            dismissContent = {
                                GameCard(activityItem)
                            }
                        )

                    }
                }

            }

I don't have the time to go over all of your code to make more changes that maybe will make it a better fit for your code and needs. but I am sure you are able to do so!

you can see my code when I had a similar problem maybe it will help to solve your problem.

itemsIndexed(celebsSearchList) { index, item ->
            if (celebsSearchList.isEmpty()) {
                println("no celebs")
            } else {
                val celebie = item
                //   celebsSearchList.forEach { celebie ->
                Card(
                    modifier = Modifier
                        .fillMaxWidth()
                        .padding(start = 20.dp, end = 20.dp, top = 10.dp, bottom = 10.dp),
                    elevation = 8.dp
                ) {
                    Row(
                        modifier = Modifier
                            .fillMaxWidth()
                            .clip(MaterialTheme.shapes.medium),
                        horizontalArrangement = Arrangement.SpaceAround,
                        verticalAlignment = Alignment.CenterVertically
                    ) {
                        Text(
                            text = celebie.FirstName + " " + celebie.LastName,
                            style = MaterialTheme.typography.h6
                        )
                        Button(
                            onClick = {
                                CelebForCelebProfile = celebie
                                navController.navigate(Screen.CelebProfileScreen.route)
                            }, colors = ButtonDefaults.buttonColors(
                                backgroundColor = Color.White, contentColor = Color.Gray
                            )
                        ) {
                            Text(text = "View Profile")
                        }
                    }
                }


            }
        }```


if you like me please upvote me :) help me gain more points on stack over flow and comment if you have any questions.