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

如何在支持ItemTouchHelper滑动删除的RecyclerView中让内部TextView可滚动?

解决方案

你遇到的是TextView滚动配置缺失+RecyclerView触摸事件冲突两个问题,按以下步骤修改即可同时实现文本垂直滚动和列表项左滑删除功能:

步骤1:补全TextView XML配置

在现有TextView属性基础上,补充滚动行为配置即可:

<TextView
    android:id="@+id/comment_text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:scrollbars="vertical"
    android:maxLines="4"
    android:overScrollMode="ifContentScrolls"
    android:text="@string/comment_text" />
  • 不要添加android:ellipsize属性,否则文本会被截断无法滚动

步骤2:适配器中添加滚动能力和触摸冲突处理

在评论列表适配器的onBindViewHolder方法中,给TextView添加滚动支持、同时处理和滑动删除的事件冲突:

// 先声明触摸坐标变量
private var downX = 0f
private var downY = 0f

override fun onBindViewHolder(holder: CommentViewHolder, position: Int) {
    // 原有绑定逻辑不变
    holder.commentText.apply {
        text = commentList[position].content
        // 核心:开启TextView内置滚动能力
        movementMethod = ScrollingMovementMethod.getInstance()

        setOnTouchListener { v, event ->
            when (event.action) {
                MotionEvent.ACTION_DOWN -> {
                    downX = event.rawX
                    downY = event.rawY
                    v.parent.requestDisallowInterceptTouchEvent(true)
                }
                MotionEvent.ACTION_MOVE -> {
                    val touchSlop = ViewConfiguration.get(v.context).scaledTouchSlop
                    val deltaX = abs(event.rawX - downX)
                    val deltaY = abs(event.rawY - downY)
                    when {
                        // 水平滑动距离更大,交给父布局处理滑动删除逻辑
                        deltaX > touchSlop && deltaX > deltaY -> v.parent.requestDisallowInterceptTouchEvent(false)
                        // 垂直滑动距离更大,交给TextView处理滚动
                        deltaY > touchSlop -> v.parent.requestDisallowInterceptTouchEvent(true)
                    }
                }
                MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {
                    // 事件结束恢复父布局拦截能力
                    v.parent.requestDisallowInterceptTouchEvent(false)
                }
            }
            // 返回false保留TextView本身的触摸事件处理
            false
        }
    }
}

核心原理说明

  1. 仅给TextView加scrollbars属性只是显示滚动条,必须设置ScrollingMovementMethod才能让TextView真正处理滚动逻辑
  2. 通过触摸事件判断滑动方向,动态控制父RecyclerView是否拦截事件,即可同时兼容垂直滚动文本、水平滑动删除两种交互

内容的提问来源于stack exchange,提问作者Bungles

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 07:36:00