gpt4 book ai didi

android - 将 SwipeToDismiss LazyColumn 项目恢复到原始状态?

转载 作者:行者123 更新时间:2023-12-04 23:57:15 25 4
gpt4 key购买 nike

我能做到SwipeToDismiss但我想恢复刷过的LazyColumn元素恢复到原来的状态。
我不想删除刷过的项目,但想将其恢复到原始状态。
我可以在 RecyclerView 中轻松实现这一点只需调用notifyItemChanged()但无法弄清楚如何在 LazyColumn 中执行此操作.
下面是我的代码:

val dataList = remember{ mutableStateListOf<ListItem>()}
for(i in 0..100){
dataList.add(ListItem("$i", "'$i' is the item number."))
}

LazyColumn(Modifier.fillMaxSize()){
items(dataList, key = {it.id}){ item ->
val dismissState = rememberDismissState(
confirmStateChange = {
if(it == DismissedToEnd || it == DismissedToStart){
Handler(Looper.getMainLooper()).postDelayed({
//dataList.remove(item)
}, 1000)
}
true
}
)
SwipeToDismiss(
state = dismissState,
directions = setOf(StartToEnd, EndToStart),
dismissThresholds = { direction ->
FractionalThreshold(if (direction == StartToEnd || direction == EndToStart) 0.25f else 0.5f)
},
background = {
val direction = dismissState.dismissDirection ?: return@SwipeToDismiss
val color by animateColorAsState(
targetValue = when(dismissState.targetValue){
Default -> Color.LightGray
DismissedToEnd -> Color.Green
DismissedToStart -> Color.Red
}
)
val icon = when(direction){
StartToEnd -> Icons.Default.Done
EndToStart -> Icons.Default.Delete
}
val scale by animateFloatAsState(
if (dismissState.targetValue == Default) 0.8f else 1.2f
)
val alignment = when (direction) {
StartToEnd -> Alignment.CenterStart
EndToStart -> Alignment.CenterEnd
}
Box(modifier = Modifier
.fillMaxSize()
.background(color)
.padding(start = 12.dp, end = 12.dp),
contentAlignment = alignment
){
Icon(icon, contentDescription = "Icon", modifier = Modifier.scale(scale))
}
},
dismissContent = {ItemScreen(dismissState = dismissState, item = item)}
)
}
}

最佳答案

你可以等currentValue成为非Default并重置状态:
根据Thinking in Compose , 可组合函数应该没有副作用 - 您不应该直接重置可组合范围内的状态。对于这种情况,您需要使用一种特殊的副作用函数,更多信息可以在副作用中找到 documentation .
重组可以发生多次,动画期间最多一帧一次,并且不使用副作用函数会导致多次调用,这可能会导致动画问题。
DismissState.reset()suspend函数, LaunchedEffect非常适合这里:它已经在协程范围内运行。

if (dismissState.currentValue != DismissValue.Default) {
LaunchedEffect(Unit) {
dismissState.reset()
}
}

关于android - 将 SwipeToDismiss LazyColumn 项目恢复到原始状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70889291/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com