标签: android-jetpack-compose-list

Jetpack Compose:嵌套 LazyColumn / LazyRow

我读过类似的主题,但找不到满意的结果:

我的用例是:创建一个评论列表(数百个项目),并可以显示对每个评论的回复(每个项目数百个项目)。

目前不可能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

47
推荐指数
2
解决办法
2万
查看次数

获取jetpack中最后一个可见项目索引组成LazyColumn

我想检查列表是否滚动到列表末尾。然而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

34
推荐指数
4
解决办法
3万
查看次数

Android Jetpack Compose 带索引的惰性列项目?

如何在 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

32
推荐指数
1
解决办法
2万
查看次数

如何使惰性列项目在 Jetpack compose 中占据完整高度?

我正在尝试使用撰写惰性列,我希望惰性列的每个项目都具有最大高度,我尝试了下面的代码,但它没有给出预期的结果

代码

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

21
推荐指数
1
解决办法
2万
查看次数

如何在 Jetpack Compose 中预览 LazyPagingItems/Paging 3 库

我认为标题说明了一切。

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)

android-jetpack-compose android-jetpack-compose-list

18
推荐指数
1
解决办法
4759
查看次数

LazyColumn - Items 关键参数的用途?

有人可以解释一下LazyListScope 的 items/itemsIndexed 函数中的“key”参数的主要用途是什么吗?如果我们指定该参数,我们会得到什么或不会得到什么?我不确定我是否理解与此参数相关的官方文档:

key - 代表该项目的稳定且唯一的密钥工厂。不允许对列表中的多个项目使用相同的密钥。密钥类型应该可以通过 Android 上的 Bundle 保存。如果传递 null,则列表中的位置将代表键。当您指定键时,滚动位置将根据键保持,这意味着如果您在当前可见项目之前添加/删除项目,则具有给定键的项目将保留为第一个可见项目。

android kotlin android-jetpack-compose android-jetpack-compose-list

17
推荐指数
1
解决办法
1万
查看次数

Jetpack Compose LazyColumn 以编程方式滚动到 Item

有没有办法以编程方式滚动LazyColumn到列表中的某个项目?我认为可以通过提升LazyColumn参数来完成,state: LazyListState = rememberLazyListState()但我不知道如何更改此状态,例如单击按钮。

android kotlin android-jetpack-compose android-jetpack-compose-list

15
推荐指数
1
解决办法
4977
查看次数

焦点时 TextField 隐藏在键盘下方

我有一个隐藏在键盘下的 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

14
推荐指数
2
解决办法
8822
查看次数

Jetpack Compose LazyRow - 居中所选项目

如何计算 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

14
推荐指数
2
解决办法
4370
查看次数

Compose LazyList 部分背景

我无法确定我的问题是否是 Jetpack Compose 缺少功能,或者我是否无法找到它是如何完成的。

\n

假设我想制作此页面

\n

在此输入图像描述

\n

它需要可滚动,因为内容很长。

\n

我还想使用惰性列来加载图像中显示的用户列表。

\n

问题是你不能在垂直可滚动布局中使用 LazyColumn,所以我想我只需将整个页面设置为 LazyColumn。\n现在还有另一个问题,我希望用户列表周围有一个框如图所示的背景颜色和圆形边框,但是您不能在 LazyListScope.items() 周围放置一个框,如果您将列表加载为单个可组合项(如 item { UserList()\xc2\xa0} ),那么它只会使它是一列,失去了懒惰的部分。

\n

一个人会怎样做呢?

\n

android android-jetpack android-jetpack-compose android-jetpack-compose-list

13
推荐指数
1
解决办法
4583
查看次数