我读过类似的主题,但找不到满意的结果:
我的用例是:创建一个评论列表(数百个项目),并可以显示对每个评论的回复(每个项目数百个项目)。
目前不可能LazyColumn在另一个内部进行嵌套LazyColumn,因为 Compose 会抛出异常:
java.lang.IllegalStateException:垂直可滚动组件是用无限最大高度约束测量的,这是不允许的。常见原因之一是嵌套布局,例如 LazyColumn 和 Column(Modifier.verticalScroll())。如果您想在项目列表之前添加标题,请在 LazyColumn 范围内的主 items() 之前添加一个标题作为单独的 item() 。发生这种情况可能还有其他原因:您的 ComposeView 被添加到具有一定权重的 LinearLayout 中、您应用了 Modifier.wrapContentSize(unbounded = true) 或编写了自定义布局。请尝试消除滚动容器上方层次结构中无限约束的来源。
上面的链接(以及我想到的其他链接)提供的解决方案是:
LazyColumn- 我无法使用它,因为每个项目可以有不同的高度(例如:单行注释与多行注释)。Columns (不是惰性)LazyColumn- 性能方面它不如惰性,当使用 Android Studio 的 Profiler 和 500 个元素的列表时,正常Column会在我的应用程序中使用 350MB 的 RAM,而使用惰性 则需要 220-240MB Composables。因此它无法正常回收。FlowColumn伴奏者 - 我没有看到这个和正常之间有任何性能差异,Column所以请参见上面。android kotlin android-recyclerview android-jetpack-compose android-jetpack-compose-list
我想检查列表是否滚动到列表末尾。然而lazyListState不提供此属性
为什么我需要这个?我想显示一个用于列表“滚动到末尾”的 FAB,如果最后一项已经可见则隐藏它
(注:确实如此,但它是internal
/**
* Non-observable way of getting the last visible item index.
*/
internal var lastVisibleItemIndexNonObservable: DataIndex = DataIndex(0)
Run Code Online (Sandbox Code Playgroud)
不知道为什么)
val state = rememberLazyListState()
LazyColumn(
state = state,
modifier = modifier.fillMaxSize()
) {
// if(state.lastVisibleItem == logs.length - 1) ...
items(logs) { log ->
if (log.level in viewModel.getShownLogs()) {
LogItemScreen(log = log)
}
}
}
Run Code Online (Sandbox Code Playgroud)
那么,如何检查我的内容是否LazyColumn滚动到数据集的末尾?
android android-jetpack-compose android-jetpack-compose-list android-jetpack-compose-lazy-column
如何在 Jetpack Compose 中访问 LazyColumn 当前项目的索引。
LazyColumn {
items(viewModel.list) { item ->
// Here I want to get the index of the item
Timber.d("item - $item")
}
}
Run Code Online (Sandbox Code Playgroud) android android-jetpack-compose android-jetpack-compose-list android-jetpack-compose-lazy-column
我正在尝试使用撰写惰性列,我希望惰性列的每个项目都具有最大高度,我尝试了下面的代码,但它没有给出预期的结果
代码
val itemsList:按 mainScreenViewModel.portfolioItems.observeAsState(listOf()) 列出
Box(modifier = Modifier.fillMaxSize()) {
Column(modifier = Modifier.matchParentSize()) {
LazyColumn(
content = {
itemsIndexed(itemsList) { index, item ->
Text(text = "Hello", modifier = Modifier.fillMaxHeight())
}
},
)
}
}
Run Code Online (Sandbox Code Playgroud) android android-jetpack android-jetpack-compose android-jetpack-compose-list
我认为标题说明了一切。
LazyPagingItems构造函数是内部的。我无法LazyPagingItems在 Preview Composable 中作为参数传递,更不用说传递示例数据了。但我想显示可组合项的预览,我应该怎么做?
@Composable
fun MainUi(users: LazyPagingItems<User>) {
Scaffold {
LazyColumn() {
items(users) {
// Rest of the code..
}
}
}
}
@Preview
@Composable
fun Preview() {
DefaultTheme {
MainUi(users = ) // How to pass sample data here?
}
}
Run Code Online (Sandbox Code Playgroud) 有人可以解释一下LazyListScope 的 items/itemsIndexed 函数中的“key”参数的主要用途是什么吗?如果我们指定该参数,我们会得到什么或不会得到什么?我不确定我是否理解与此参数相关的官方文档:
key - 代表该项目的稳定且唯一的密钥工厂。不允许对列表中的多个项目使用相同的密钥。密钥类型应该可以通过 Android 上的 Bundle 保存。如果传递 null,则列表中的位置将代表键。当您指定键时,滚动位置将根据键保持,这意味着如果您在当前可见项目之前添加/删除项目,则具有给定键的项目将保留为第一个可见项目。
android kotlin android-jetpack-compose android-jetpack-compose-list
有没有办法以编程方式滚动LazyColumn到列表中的某个项目?我认为可以通过提升LazyColumn参数来完成,state: LazyListState = rememberLazyListState()但我不知道如何更改此状态,例如单击按钮。
android kotlin android-jetpack-compose android-jetpack-compose-list
我有一个隐藏在键盘下的 TextField 问题,我在这里找到了类似问题的答案,但它们对我的情况没有帮助。我有一个 LazyColumn,其中包含不同可组合项的列表,当窗口中没有足够的元素来激活滚动时,专注于 TextField 不会将聚焦的 TextField 提升到键盘上方。键盘只是隐藏它。我的代码:
val listState = rememberLazyListState()
typealias ComposableType = @Composable (Int) -> Unit
val uiList = listOf<ComposableType>( {IconButton}, {Text}, {CustomTextField(listState,it)}, {CustomTextField(listState,it)})
LazyColumn() {
itemsIndexed(uiList) { index, ui ->
ui.invoke(index)
}
}
val scope = rememberCoroutineScope()
@Composable
CustomTextField(scrollState: LazyListState, position: Int) {
OutlinedTextField(
modifier = Modifier.onFocusEvent { focusState ->
if (focusState.isFocused) {
scope.launch {
scrollState.animateScrollToItem(position)
}
}
)
}
Run Code Online (Sandbox Code Playgroud)
因此,例如,如果我的 uiList 中有 10 个 CustomTextField,则当其中一个 TextField 获得焦点时,滚动就会起作用。但是,当 uiList 中只有 2 个 TextField 时,关注其中任何一个都不会将它们提升到键盘上方。 …
android-jetpack android-jetpack-compose android-compose-textfield android-jetpack-compose-list
如何计算 LazyRow 中所选项目的位置并将其用于使项目在屏幕上居中?这些物品将根据其内容而具有不同的尺寸。
如果我选择lazyListState.animateScrollToItem(index)所选项目将位于 LazyRow 的左侧。

我目前拥有的代码:
@Composable
fun Test() {
Column {
TestRow(listOf("Angola", "Bahrain", "Afghanistan", "Denmark", "Egypt", "El Salvador", "Fiji", "Japan", "Kazakhstan", "Kuwait", "Laos", "Mongolia"))
TestRow(listOf("Angola", "Bahrain", "Afghanistan"))
}
}
@OptIn(ExperimentalSnapperApi::class)
@Composable
fun TestRow(items: List<String>) {
val selectedIndex = remember { mutableStateOf(0) }
val lazyListState = rememberLazyListState()
val coroutineScope = rememberCoroutineScope()
LazyRow(
modifier = Modifier.fillMaxWidth(),
state = lazyListState,
horizontalArrangement = Arrangement.spacedBy(8.dp, Alignment.CenterHorizontally),
contentPadding = PaddingValues(horizontal = 12.dp),
flingBehavior = rememberSnapperFlingBehavior(
lazyListState = lazyListState,
snapOffsetForItem = SnapOffsets.Start …Run Code Online (Sandbox Code Playgroud) android kotlin android-jetpack-compose android-jetpack-compose-list
我无法确定我的问题是否是 Jetpack Compose 缺少功能,或者我是否无法找到它是如何完成的。
\n假设我想制作此页面
\n\n它需要可滚动,因为内容很长。
\n我还想使用惰性列来加载图像中显示的用户列表。
\n问题是你不能在垂直可滚动布局中使用 LazyColumn,所以我想我只需将整个页面设置为 LazyColumn。\n现在还有另一个问题,我希望用户列表周围有一个框如图所示的背景颜色和圆形边框,但是您不能在 LazyListScope.items() 周围放置一个框,如果您将列表加载为单个可组合项(如 item { UserList()\xc2\xa0} ),那么它只会使它是一列,失去了懒惰的部分。
\n一个人会怎样做呢?
\nandroid android-jetpack android-jetpack-compose android-jetpack-compose-list