从 Recyclerview 分离 SwipeListener

Dettach SwipeListener from Recyclerview

我的 RecyclerView 有一个简单的 left/right 滑动侦听器,所以我在片段中创建了以下函数。

ItemTouchHelper itemTouchHelper;
public void setDeleteUpdateSwipeListener() {
      ItemTouchHelper.SimpleCallback simpleCallback = new ItemTouchHelper.SimpleCallback(0,
            ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {

        @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");
        }


    };

    itemTouchHelper = new ItemTouchHelper(simpleCallback);
    itemTouchHelper.attachToRecyclerView(rvListDriver);
}

如果用户长时间点击某个项目,我不想允许任何擦除,所以我在我的适配器中这样做了:

@Override
public void onBindViewHolder(@NonNull DriverListAdapter.ViewHolder holder, int position) {
    final ViewHolder recyclerViewHolder = holder;
    holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
          
            drListFrag.setNoSwipeListener();
            return true;
        }
    });
}

以及我片段中对应的函数:

public void setNoSwipeListener() {
    itemTouchHelper = new ItemTouchHelper(null);
    itemTouchHelper.attachToRecyclerView(null);
}

但是,滑动仍在发生,跟踪 Log.e 也会被调用。我确保函数 noSwipe 被调用。我还尝试了其他 ,但其中 none 对我有用。

问题可能是因为我的 RecycerViewAddapter 中没有 swipelistener,而是在我的 Fragment/RecycerView 对象中。

试试这个

public void setNoSwipeListener() {
    // itemTouchHelper = new ItemTouchHelper(null);
    itemTouchHelper.attachToRecyclerView(null);
}

您可以使用自定义 ItemTouchHelper.Callback 并覆盖 isItemViewSwipeEnabled() 方法。

该方法的return值决定是否启用滑动。如果 true 则它已启用。

因此,您可以在自定义的 ItemTouchHelper.Callback 中使用一个 setter 的本地布尔字段,并在 setNoSwipeListener()

中将其值切换为 false ]

isItemViewSwipeEnabled() 应该 return 这个本地字段

并且当触摸事件结束时,将此布尔值重置为true:

holder.listItem.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_UP) {
            // Reset the boolean to true
        }
        return false;
    }
});