在非惰性列中使用项目键

Noa*_*oah 7 android-jetpack-compose

LazyColumn具有项目键,以便将项目的状态与唯一标识符而不是列表索引联系起来。有没有一种方法可以在像这样的非惰性列表中使用项目键?

Column {
  for (item in list) {
    Text(item)
  }
}
Run Code Online (Sandbox Code Playgroud)

我问的原因是因为我想实现SwipeToDismiss从列表中删除项目,这只有在将密钥传递给LazyColumn解决方案)时才有效,但是我的可忽略项目列表嵌套在 a 内部LazyColumn,并且我无法嵌套 aLazyColumn在 another 的 itemContent 块内部LazyColumn(不允许在同一方向布局中嵌套可滚动):

val items = listOf<String>(...)
val groups = items.groupBy { it.first() }

LazyColumn {
  items(groups, { /* key */ }) { (firstChar, group) ->
    // not allowed!
    LazyColumn {
      items(group, { /* key */ }) { item ->
        Text(item)
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我可以将调用items()本身包装在 for 循环中,如下所示:

val items = listOf<String>(...)
val groups = items.groupBy { it.first() }

LazyColumn {
  items(groups, { /* key */ }) { (firstChar, group) ->
    // not allowed!
    LazyColumn {
      items(group, { /* key */ }) { item ->
        Text(item)
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,每个外循环项目中的状态都将根据其索引进行键控。我还需要为组提供项目键,以便在位置更改时保留其状态。

chu*_*ckj 12

一般模式是,

for (item in items) {
  key(item) {
    ... // use item
  }
}
Run Code Online (Sandbox Code Playgroud)

可组合项key很特殊,当集合中的item值移动时,Compose 将用作检测状态何时应移动的键。itemitems

  • 与这个特定问题无关,但这是我遇到的一个问题的答案,如果我删除了重复的可组合项,则删除自定义布局中的项目会突然使用错误的记住动画值。我发现它变得很混乱,可能需要像惰性列这样的键!谢谢你! (2认同)