相关疑难解决方法(0)

Jetpack Compose:如何将 LazyVerticalGrid 放入可滚动列中?

当尝试将 a 放入可滚动LazyVerticalGrid内容时,出现以下错误: Column

java.lang.IllegalStateException:不允许在同一方向嵌套可滚动布局,例如 LazyColumn 和 Column(Modifier.verticalScroll())。如果您想在项目列表之前添加标题,请查看 LazyColumn 组件,该组件具有 DSL api,允许首先通过 item() 函数添加标题,然后通过 items() 添加项目列表。

我不是在制作传统的列表,我只是有很多太大而无法在屏幕上显示的元素。因此,我希望该列滚动,以便我可以看到所有元素。这是我的代码:

@ExperimentalFoundationApi
@Composable
fun ProfileComposable(id: String?) {
    val viewModel: ProfileViewModel = viewModel()
    if (id != null) {
        viewModel.getProfile(id)
        val profile = viewModel.profile.value
        val scrollState = rememberScrollState()
        if (profile != null) {
            Column(modifier = Modifier
                .fillMaxWidth()
                .fillMaxHeight()
                .verticalScroll(scrollState)) {
                Row() {
                    ProfilePic(profile.getImgUrl(), profile.name)
                    Column(Modifier.padding(16.dp)) {
                        ProfileName(profile.name)
                        Stats(profile.stats) //      <--------------- the offending composable
                    }
                }
                Sprites(sprites = profile.sprites)
                TextStat(profile.id.toString(), "Pokemon Number")
                TextStat(profile.species.name, "Species") …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-jetpack-compose

50
推荐指数
5
解决办法
3万
查看次数

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 Compose 的 LazyVerticalGrid 有跨度策略吗

我有一个有 2 个单元格的 LazyVerticalGrid。

LazyVerticalGrid(
    cells = GridCells.Fixed(2),
    content = {
        items(moviePagingItems.itemCount) { index ->
            val movie = moviePagingItems[index] ?: return@items
            MovieItem(movie, Modifier.preferredHeight(320.dp))
        }
        renderLoading(moviePagingItems.loadState)
    }
)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

LazyGridScope我正在尝试使用s修饰符显示全角加载fillParentMaxSize。

fun LazyGridScope.renderLoading(loadState: CombinedLoadStates) {
  when {
    loadState.refresh is LoadState.Loading -> {
        item {
            LoadingColumn("Fetching movies", Modifier.fillParentMaxSize())
        }
    }
    loadState.append is LoadState.Loading -> {
        item {
            LoadingRow(title = "Fetching more movies")
        }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

但由于我们有 2 个单元格,因此加载会占据屏幕的一半。像这样:

在此输入图像描述

有没有办法让我的加载视图占据全宽?

android android-jetpack-compose

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

垂直滚动列内的 LazyColumn

我有一个,我想在内部Column(modifier = Modifier.verticalScroll(mainScrollState))使用而不明确指定高度。LazyColumnColumnLazyColumn

现在它给了我 java.lang.IllegalStateException: Vertically scrollable component was measured with an infinity maximum height constraints, which is disallowed.

我尝试使用NestedScrollConnection但它没有给我正确的解决方案。有什么解决方法吗?

我的整个可组合项如下所示:

Scaffold() {
    Column() {
       Column() { 
          LazyColumn { ... }
       }
       Column() { ... }
    }
}
Run Code Online (Sandbox Code Playgroud)

android android-jetpack-compose

5
推荐指数
1
解决办法
4770
查看次数