所以我想要实现的是:
借助此处答案,我可以通过将脚手架封装在 ModalBottonSheetLayout 内来实现上述目标:Jetpack Compose Scaffold + Modal Bottom Sheet
问题:
我怎样才能做到这一点?主可组合项没有有关其托管的可组合项中存在的惰性列内的项目的任何信息。
有没有不同的方法来解决这个问题?
这是我的代码:
HomeComposable.kt
fun HomeComposable(homeViewModel: HomeViewModel,
navController: NavHostController) {
ModalBottomSheetLayout(
sheetContent = {
//get the id of the message here so it can be
//deleted
Button(
text = "delete Message")
onClick = deleteMessage(message.id
)
}
) {
Scaffold(
content = {
NavHost(navController = navController, startDestination =
WHATS_NEW_COMPOSABLE) {
composable(MESSAGES_COMPOSABLE) {
MessageItemsComposable(
homeViewModel,
navController, …Run Code Online (Sandbox Code Playgroud) android android-jetpack-compose android-jetpack-compose-scaffold android-jetpack-compose-list jetpack-compose-navigation
使用 Jetpack Compose 和伴奏寻呼机,我尝试创建一个HorizontalPager位置:
Pager项目有最大宽度作为一个例子,我编写了以下代码(为了简单起见,我制作了Text物品,但实际上,我实际上制作了更复杂的Card物品):
@Composable
fun MyText(modifier: Modifier) {
Text(
text = LOREM_IPSUM_TEXT,
modifier = modifier
.wrapContentHeight()
.border(BorderStroke(1.dp, Color.Red))
)
}
@ExperimentalPagerApi
@Composable
fun MyPager(pagerItem: @Composable () -> Unit = {}) {
Scaffold {
Column(
modifier = Modifier
.fillMaxSize()
// In case items in the VP are taller than the screen -> scrollable
.verticalScroll(rememberScrollState())
) {
HorizontalPager(
contentPadding = PaddingValues(32.dp),
itemSpacing = 16.dp,
count = 3,
) { …Run Code Online (Sandbox Code Playgroud) android android-jetpack-compose android-jetpack-compose-list jetpack-compose-accompanist android-jetpack-compose-pager
LazyColumn我正在寻找一种有效的方法来触发 a 的每个项目在可见时触发回调,但仅一次。
有没有一种 Compose-y 的方式来处理这个问题?
我尝试snapshotFlow按如下方式使用,但无论我使用哪种副作用,它都会在用户滚动时一遍又一遍地触发。
val listState = rememberLazyListState()
LaunchedEffect(listState) {
snapshotFlow { listState.layoutInfo.visibleItemsInfo}
.map { it.first() }
.collect {
MyAnalyticsService.someVisibleItemCallback()
}
}
Run Code Online (Sandbox Code Playgroud)
我可以想象的另一种方法是将其烘焙到模型状态,如下所示。
data class SomeObject(
val someStuff: SomeStuff,
val isSeen: Boolean = false
)
Run Code Online (Sandbox Code Playgroud)
我怎样才能有效地处理这个问题?
android android-jetpack-compose android-jetpack-compose-list lazycolumn
我可以让 LazyColumn 上的项目仅占据剩余的可用高度吗?我尝试使用,fillParentMaxSize但它使该项目与 LazyColumn 的大小相同,因此我无法将另一个项目放在列表顶部,例如我想要随内容滚动的标题。
示例代码
@Composable
fun LazyColumnTest() {
LazyColumn(
modifier = Modifier.fillMaxSize()
) {
item {
Column {
Text(text = "This is a title", style = MaterialTheme.typography.h4)
Text(text = "With a subtitle", style = MaterialTheme.typography.subtitle1)
}
}
item {
OtherLayout(modifier = Modifier.fillParentMaxHeight())
}
}
}
@Composable
fun OtherLayout(modifier: Modifier = Modifier) {
Box(modifier = modifier.fillMaxSize()) {
Icon(
Icons.Default.Close,
contentDescription = null,
modifier = Modifier
.size(150.dp)
.align(Alignment.TopCenter)
)
Button(
onClick = { /*TODO*/ },
modifier = Modifier …Run Code Online (Sandbox Code Playgroud) android android-jetpack-compose android-jetpack-compose-list
我正在尝试运行一个简单的 LazyColumn 对象,但无法在没有此奇怪错误的情况下运行它。这是我的代码:
@Composable
fun Test(){
LazyColumn() {
Text(text = "Placeholder", fontSize= 30.sp)
Spacer(modifier = Modifier.padding(10.dp))
}
}
Run Code Online (Sandbox Code Playgroud)
以下是错误:
org.jetbrains.kotlin.diagnostics.SimpleDiagnostic@74c0fa2 (error: could not render message)
org.jetbrains.kotlin.diagnostics.SimpleDiagnostic@c077eec3 (error: could not render message)
Run Code Online (Sandbox Code Playgroud)
是我的代码有问题还是bug?*我想通过一遍又一遍地复制并粘贴 LazyColumn() 语句后面的行来测试滚动功能
kotlin android-studio android-jetpack-compose android-jetpack-compose-list
我正在使用 firebase 构建一个聊天应用程序,我需要在编写消息时最后和在接收时开始时对齐聊天气泡,就像在 Whatsapp 中一样。如果我在lazyColumn中使用horizontalArrangement,它会影响所有项目。我尝试在聊天气泡中使用modifier.align,但没有任何反应。我怎样才能做到这一点?
下面是我的懒惰专栏
LazyColumn(
modifier = Modifier.fillMaxWidth(),
) {
if (list != null && list.isNotEmpty()) {
items(items = list) {
if (it.user1id == args.userId) {
ChatCard(
message = it,
color = Color.Magenta,
modifier = Modifier
.align(Alignment.CenterHorizontally)
.padding(
start = 32.dp,
end = 4.dp,
top = 4.dp
)
)
} else {
ChatCard(
message = it,
color = Color.White,
Modifier.padding(
start = 4.dp,
end = 32.dp,
top = 4.dp
)
)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
@Composable
fun ChatCard(message: …Run Code Online (Sandbox Code Playgroud) android kotlin android-jetpack-compose android-jetpack-compose-list
在 xml 中,您可以使用 GridLayoutManager 中的 GridLayoutManager.SpanSizeLookup 来设置单个项目的跨度大小(该项目将在行中使用多少列,例如,在 3 列的网格中,我可以将第一个项目设置为跨度大小3 所以它将使用网格的所有宽度),但在 Compose 中我找不到方法来做到这一点,垂直网格只有一种方法设置全局跨度计数和添加项目,但不能设置跨度大小一个单独的项目,有办法做到吗?
android android-jetpack-compose android-jetpack-compose-list
顶部有惰性列,惰性列下方有输入电话号码布局并从电话簿布局添加联系人,我希望当未添加联系人时此布局位于顶部,当我添加大量联系人时输入电话号码并添加电话簿布局中的联系人会随着惰性列滚动并移出屏幕。我不让他们走出屏幕。当接触较多时,它们必须粘在底部。
android kotlin android-studio android-jetpack-compose android-jetpack-compose-list
FlatListofReact Native有一个属性viewabilityConfigCallbackPairs,您可以在其中设置:
viewabilityConfig: {
itemVisiblePercentThreshold: 50,
waitForInteraction: true,
}
Run Code Online (Sandbox Code Playgroud)
以 50% 的阈值以及交互或滚动后检测列表的可见项目。
Jetpack Compose 也有类似的东西吗?
有LazyListState一些布局信息。但我想知道这个用例是否有任何内置组件/属性。
编辑
我有一个卡片视图列表,我想检测哪些卡片项目(至少 50% 的卡片可见)在显示屏上可见。但只有当用户单击卡片或滚动列表时才需要检测到它。
android android-jetpack-compose android-jetpack-compose-list android-jetpack-compose-lazy-column
我想获得一个LazyRow看起来像这样的:
|--aaa-b|bb-cccc|-dd... ...|w--x---|
|--------| 是一屏宽度
元素的大小各不相同,但它们之间的间距是固定的。我想我可以添加一些开始内容填充,以便LazyRow“aaa”可组合项与屏幕中心对齐,但我不知道它的宽度。
如果您认为我问的不清楚,请发表评论。
更新
添加了 gif 以便更好地理解
android android-jetpack-compose android-jetpack-compose-list