You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Kotlin无依赖实现侧滑显示按钮(带吸附与删除逻辑)的问题求助

Android Kotlin无依赖实现侧滑显示按钮(带吸附与删除逻辑)的问题求助

各位大佬好,我刚入坑Android Kotlin开发,最近卡在了一个侧滑功能的实现上,想请教一下大家!

我想要实现一个无需依赖第三方库的侧滑显示操作按钮功能,核心需求有两个:

  • 吸附逻辑:当内容区域滑到指定阈值时,要“贴住”后面的按钮区域,不会随意回弹
  • 删除逻辑:当滑动超过删除阈值时,RecyclerView的item会被第一个操作按钮(删除按钮)填满,随后执行item删除操作

但现在遇到了棘手的问题:使用ItemTouchHelper的时候,dX是相对于内容当前位置来移动的,这导致删除阈值的位置计算总是出bug,dX的数值会变得异常大。而且因为我需要移动的是内容区域(cardContent)来露出后面的按钮,而不是移动整个item元素,所以没办法直接用super.onChildDraw传入dX参数的常规方式来处理。

以下是我当前RecyclerView item的XML布局代码:

<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/itemStroke"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="12dp"
    app:cardBackgroundColor="@android:color/transparent"
    app:strokeWidth="1dp"
    app:strokeColor="@color/green"
    app:cardCornerRadius="12dp"
    android:clipToPadding="false"
    android:clipChildren="false">

    <FrameLayout
        android:id="@+id/itemCard"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout
            android:id="@+id/itemBtns"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="end"
            android:showDividers="beginning|middle"
            android:divider="?android:attr/dividerHorizontal"
            android:orientation="horizontal">

            <ImageButton
                android:id="@+id/btnDelete"
                android:layout_width="40dp"
                android:layout_height="match_parent"
                android:src="@drawable/ic_delete_18"
                android:background="@color/red"
                android:scaleType="centerInside"/>

            <ImageButton
                android:id="@+id/btnOptions"
                android:layout_width="40dp"
                android:layout_height="match_parent"
                android:src="@drawable/ic_options_24"
                android:background="@color/white"
                android:scaleType="centerInside"
                app:tint="@color/black"/>

            <ImageButton
                android:id="@+id/btnArchive"
                android:layout_width="40dp"
                android:layout_height="match_parent"
                android:src="@drawable/ic_archive_18"
                android:background="@color/blue"
                android:scaleType="centerInside" />

        </LinearLayout>

        <androidx.constraintlayout.widget.ConstraintLayout
            android:id="@+id/cardContent"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/third">

            <TextView
                android:id="@+id/textDateStart"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="12dp"
                android:layout_marginTop="4dp"
                android:layout_marginEnd="4dp"
                android:layout_marginBottom="4dp"
                android:text="07.07.2024"
                android:textColor="@color/white_50"
                android:textSize="12sp"
                app:layout_constraintBottom_toTopOf="@+id/textItemName"
                app:layout_constraintEnd_toStartOf="@id/textDateSpare"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent" />

            <TextView
                android:id="@+id/textDateSpare"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="/"
                android:textSize="12sp"
                android:textColor="@color/white_50"
                app:layout_constraintBaseline_toBaselineOf="@id/textDateStart"
                app:layout_constraintStart_toEndOf="@id/textDateStart"
                app:layout_constraintEnd_toStartOf="@id/textDateEnd" />

            <TextView
                android:id="@+id/textDateEnd"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="4dp"
                android:text="~"
                android:textSize="12sp"
                android:textColor="@color/white_50"
                app:layout_constraintBaseline_toBaselineOf="@id/textDateSpare"
                app:layout_constraintStart_toEndOf="@id/textDateSpare" />

            <View
                android:id="@+id/statusIndicator"
                android:layout_width="8dp"
                android:layout_height="8dp"
                android:layout_marginStart="6dp"
                android:background="@drawable/bg_status_indicator_active"
                app:layout_constraintTop_toTopOf="@id/textItemName"
                app:layout_constraintBottom_toBottomOf="@id/textItemName"
                app:layout_constraintStart_toEndOf="@id/textItemName" />

        </androidx.constraintlayout.widget.ConstraintLayout>

    </FrameLayout>

</com.google.android.material.card.MaterialCardView>

有没有大佬能指点一下,这种情况下该怎么处理dX的计算问题,以及如何正确实现移动内容区域来露出按钮、同时完成吸附和删除的逻辑呀?多谢各位了!

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 07:33:08