当尝试将 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) 我读过类似的主题,但找不到满意的结果:
我的用例是:创建一个评论列表(数百个项目),并可以显示对每个评论的回复(每个项目数百个项目)。
目前不可能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
我有一个有 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 个单元格,因此加载会占据屏幕的一半。像这样:
有没有办法让我的加载视图占据全宽?
我有一个,我想在内部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)