android compose list item 侧滑 删除按钮

您需要实现可侧滑删除的Android Compose列表项。以下是一个简单的实现:

  1. 创建一个自定义的列表项组件,例如 SwipeableListItem

  2. SwipeableListItem 组件中添加一个 SwipeableState 对象,用于跟踪侧滑状态。

  3. SwipeableListItem 组件中添加一个 Modifier,使其可滑动。

Modifier.swipeable(
    state = swipeableState,
    anchors = mapOf(
        0f to SwipeDirection.Left,
        width.toFloat() to SwipeDirection.Right
    ),
    thresholds = { _, _ -> FractionalThreshold(0.3f) },
    orientation = Orientation.Horizontal
)
  1. 添加一个删除按钮,当侧滑距离超过阈值时,显示出来。
if (swipeableState.targetValue == SwipeDirection.Left) {
    Box(
        modifier = Modifier
            .fillMaxHeight()
            .background(MaterialTheme.colors.error)
            .align(Alignment.CenterEnd)
            .padding(end = 16.dp)
            .clickable { onDelete() }
    ) {
        Icon(
            Icons.Default.Delete,
            contentDescription = "Delete",
            tint = Color.White,
            modifier = Modifier.padding(16.dp)
        )
    }
}

完整代码示例:

@Composable
fun SwipeableListItem(
    text: String,
    onDelete: () -> Unit
) {
    val swipeableState = rememberSwipeableState(initialValue = SwipeDirection.None)

    Box(
        modifier = Modifier
            .fillMaxWidth()
            .height(64.dp)
            .swipeable(
                state = swipeableState,
                anchors = mapOf(
                    0f to SwipeDirection.Left,
                    width.toFloat() to SwipeDirection.Right
                ),
                thresholds = { _, _ -> FractionalThreshold(0.3f) },
                orientation = Orientation.Horizontal
            )
    ) {
        Text(
            text = text,
            modifier = Modifier
                .fillMaxSize()
                .background(MaterialTheme.colors.surface)
                .padding(horizontal = 16.dp)
                .align(Alignment.CenterStart)
        )

        if (swipeableState.targetValue == SwipeDirection.Left) {
            Box(
                modifier = Modifier
                    .fillMaxHeight()
                    .background(MaterialTheme.colors.error)
                    .align(Alignment.CenterEnd)
                    .padding(end = 16.dp)
                    .clickable { onDelete() }
            ) {
                Icon(
                    Icons.Default.Delete,
                    contentDescription = "Delete",
                    tint = Color.White,
                    modifier = Modifier.padding(16.dp)
                )
            }
        }
    }
}

enum class SwipeDirection { Left, Right, None }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值