RecyclerView长按Item时如何解除ItemTouchHelper滑动监听?
问题根因
你当前的setNoSwipeListener写法逻辑错误:你创建了一个全新的ItemTouchHelper实例并绑定到空RecyclerView,但最早绑定到rvListDriver的旧ItemTouchHelper实例并没有被解绑,仍然在监听滑动事件,所以原有逻辑会继续触发。
这个问题和你把滑动监听定义在Fragment还是Adapter中无关,完全是解绑逻辑错误导致的。
方案一:通过开关动态控制滑动(推荐)
不需要重建/解绑ItemTouchHelper,只需要在原有回调中加状态判断即可,还支持后续恢复滑动:
- 在Fragment中新增状态控制变量:
// 滑动控制开关,默认允许滑动 private boolean isSwipeAllowed = true;
- 修改原有
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"); } };
- 修改禁止滑动的方法,仅修改开关状态即可:
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
相关产品推荐
相关产品推荐

