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

RecyclerView长按Item时如何解除ItemTouchHelper滑动监听?

问题根因

你当前的setNoSwipeListener写法逻辑错误:你创建了一个全新的ItemTouchHelper实例并绑定到空RecyclerView,但最早绑定到rvListDriver的旧ItemTouchHelper实例并没有被解绑,仍然在监听滑动事件,所以原有逻辑会继续触发。
这个问题和你把滑动监听定义在Fragment还是Adapter中无关,完全是解绑逻辑错误导致的。


方案一:通过开关动态控制滑动(推荐)

不需要重建/解绑ItemTouchHelper,只需要在原有回调中加状态判断即可,还支持后续恢复滑动:

  1. 在Fragment中新增状态控制变量:
// 滑动控制开关,默认允许滑动
private boolean isSwipeAllowed = true;
  1. 修改原有ItemTouchHelper.SimpleCallback,新增getSwipeDirs方法判断滑动权限:
ItemTouchHelper.SimpleCallback simpleCallback = new ItemTouchHelper.SimpleCallback(0,
      ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
    @Override
    public int getSwipeDirs(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
        if (!isSwipeAllowed) {
            // 禁止滑动时返回0,代表不支持任何滑动方向
            return 0;
        }
        return super.getSwipeDirs(recyclerView, viewHolder);
    }

    // 原有onMove、onSwiped逻辑保持不变
    @Override
    public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
        return false;
    }
    @Override
    public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
        //do stuff
        Log.e("i still", "get called");
    }
};
  1. 修改禁止滑动的方法,仅修改开关状态即可:
public void setNoSwipeListener() {
    isSwipeAllowed = false;
}

// 后续需要恢复滑动时可调用此方法
public void enableSwipeListener() {
    isSwipeAllowed = true;
}

方案二:直接解绑原有ItemTouchHelper

如果你不需要后续恢复滑动,直接解绑最早绑定到RecyclerView的实例即可,不要创建新的实例:

public void setNoSwipeListener() {
    if (itemTouchHelper != null) {
        itemTouchHelper.attachToRecyclerView(null);
        itemTouchHelper = null;
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 10:45:02