标签: android-jetpack-compose-list

如何在 jetpack compose 中使用 BottomBar 实现底部工作表

所以我想要实现的是:

  • 托管 BottomNav Bar 的家庭可组合项(此处使用脚手架)
  • 底部导航栏与其他 3 个可组合项相连
  • 3 个可组合项中的每一个都有自己的惰性列
  • 3 个惰性列中的每个项目都有一个菜单图标,单击该图标会打开底部工作表

借助此处答案,我可以通过将脚手架封装在 ModalBottonSheetLayout 内来实现上述目标:Jetpack Compose Scaffold + Modal Bottom Sheet

问题:

  • 底部工作表的目的是显示一个菜单项,单击该菜单项应从lazyColumn 中删除该项目
  • 因此底部工作表需要知道单击以删除它的项目的详细信息

我怎样才能做到这一点?主可组合项没有有关其托管的可组合项中存在的惰性列内的项目的任何信息。

有没有不同的方法来解决这个问题?

这是我的代码:

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

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

Jetpack Compose - 具有最大宽度的项目的 Horizo​​ntalPager 项目间距/填充

使用 Jetpack Compose 和伴奏寻呼机,我尝试创建一个HorizontalPager位置:

  1. 显示当前项目左侧和右侧项目的边缘
  2. 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

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

LazyColumn 回调仅可见一次的项目

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

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

如何使 LazyColumn 项目占据 Jetpack Compose 上的剩余高度

我可以让 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

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

在 Jetpack compose 中尝试 LazyColumn() 时出现奇怪的错误

我正在尝试运行一个简单的 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

4
推荐指数
1
解决办法
5515
查看次数

如何在 jetpackCompose 的 LazyColumn 中对齐不同的项目

我正在使用 firebase 构建一个聊天应用程序,我需要在编写消息时最后和在接收时开始时对齐聊天气泡,就像在 Whatsapp 中一样。如果我在lazyColumn中使用horizo​​ntalArrangement,它会影响所有项目。我尝试在聊天气泡中使用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

4
推荐指数
1
解决办法
1563
查看次数

Jetpack Compose Vertical Grid 单项跨度大小

在 xml 中,您可以使用 GridLayoutManager 中的 GridLayoutManager.SpanSizeLookup 来设置单个项目的跨度大小(该项目将在行中使用多少列,例如,在 3 列的网格中,我可以将第一个项目设置为跨度大小3 所以它将使用网格的所有宽度),但在 Compose 中我找不到方法来做到这一点,垂直网格只有一种方法设置全局跨度计数和添加项目,但不能设置跨度大小一个单独的项目,有办法做到吗?

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

4
推荐指数
1
解决办法
3854
查看次数

我想实现下面的布局,按钮应该在屏幕底部,当惰性列被填充时,按钮不应该出去

顶部有惰性列,惰性列下方有输入电话号码布局并从电话簿布局添加联系人,我希望当未添加联系人时此布局位于顶部,当我添加大量联系人时输入电话号码并添加电话簿布局中的联系人会随着惰性列滚动并移出屏幕。我不让他们走出屏幕。当接触较多时,它们必须粘在底部。

在此输入图像描述

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

4
推荐指数
1
解决办法
1340
查看次数

如何检查 Jetpack Compose 中列表项的可见性

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

3
推荐指数
1
解决办法
7750
查看次数

Jetpack Compose - 使 LazyRow 中的第一个元素与屏幕中心对齐

我想获得一个LazyRow看起来像这样的:

|--aaa-b|bb-cccc|-dd... ...|w--x---|

|--------| 是一屏宽度

元素的大小各不相同,但它们之间的间距是固定的。我想我可以添加一些开始内容填充,以便LazyRow“aaa”可组合项与屏幕中心对齐,但我不知道它的宽度。

如果您认为我问的不清楚,请发表评论。

更新

添加了 gif 以便更好地理解

在此输入图像描述

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

3
推荐指数
1
解决办法
4850
查看次数