如何在支持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 } } }
核心原理说明
- 仅给TextView加
scrollbars属性只是显示滚动条,必须设置ScrollingMovementMethod才能让TextView真正处理滚动逻辑 - 通过触摸事件判断滑动方向,动态控制父RecyclerView是否拦截事件,即可同时兼容垂直滚动文本、水平滑动删除两种交互
内容的提问来源于stack exchange,提问作者Bungles
相关产品推荐
相关产品推荐

