返回

RecyclerView根据Item类型开关长按顺序拖拽

Android

一、实现RecyclerView长按拖拽排序

RecyclerView的ItemTouchHelper.Callback是实现Item拖拽功能的关键。下面介绍如何使用它来实现长按拖拽排序:

  1. 首先需要在Activity或Fragment中声明一个ItemTouchHelper.Callback对象。
ItemTouchHelper.Callback callback = new ItemTouchHelper.Callback() {
    // ...
};
  1. 然后,将ItemTouchHelper.Callback对象传递给ItemTouchHelper的构造函数,并将其附加到RecyclerView上。
ItemTouchHelper helper = new ItemTouchHelper(callback);
helper.attachToRecyclerView(recyclerView);
  1. 最后,实现ItemTouchHelper.Callback中的方法来定义拖拽和滑动操作。

二、ItemTouchHelper.Callback接口开关设置

ItemTouchHelper.Callback接口提供了几个方法来控制拖拽和滑动操作。

  • getMovementFlags():该方法返回一个标志,指示允许的拖拽和滑动方向。
  • onMove():该方法在两个Item之间发生拖拽操作时被调用。
  • onSwiped():该方法在Item被滑动删除时被调用。

以下是可以设置的标志:

  • ItemTouchHelper.ACTION_STATE_DRAG:允许拖拽操作。
  • ItemTouchHelper.ACTION_STATE_SWIPE:允许滑动操作。
  • ItemTouchHelper.START:允许向左滑动。
  • ItemTouchHelper.END:允许向右滑动。
  • ItemTouchHelper.UP:允许向上滑动。
  • ItemTouchHelper.DOWN:允许向下滑动。

下面是设置Item拖拽和滑动开关的示例:

@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
    int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
    int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;
    return makeMovementFlags(dragFlags, swipeFlags);
}

在上面的代码中,我们允许Item向上和向下拖拽,并允许向左和向右滑动。

三、核心部分:Item拖拽事件处理、判断、记录

接下来,我们需要实现ItemTouchHelper.Callback中的onMove()onSwiped()方法来处理拖拽和滑动操作。

  1. onMove()方法在两个Item之间发生拖拽操作时被调用。
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
    // ...
}

该方法返回一个布尔值,指示是否允许拖拽操作。如果返回true,则允许拖拽操作;如果返回false,则禁止拖拽操作。

onMove()方法中,我们需要判断拖拽的Item是否允许拖拽。如果允许拖拽,则需要记录拖拽的Item的位置和目标位置。

  1. onSwiped()方法在Item被滑动删除时被调用。
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
    // ...
}

该方法没有返回值。在onSwiped()方法中,我们需要处理滑动操作。例如,我们可以将滑动的Item从列表中删除。

四、提供示例代码

public class ItemTouchHelperCallback extends ItemTouchHelper.Callback {

    private final ItemTouchHelperAdapter adapter;

    public ItemTouchHelperCallback(ItemTouchHelperAdapter adapter) {
        this.adapter = adapter;
    }

    @Override
    public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
        // 允许上下拖动
        int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
        // 允许左右滑动
        int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;
        return makeMovementFlags(dragFlags, swipeFlags);
    }

    @Override
    public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
        // 判断是否允许拖动
        if (adapter.isItemDraggable(viewHolder.getAdapterPosition(), target.getAdapterPosition())) {
            // 记录拖动的位置
            adapter.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition());
            return true;
        }
        return false;
    }

    @Override
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
        // 判断是否允许滑动
        if (adapter.isItemSwipeable(viewHolder.getAdapterPosition())) {
            // 记录滑动的位置
            adapter.onItemSwiped(viewHolder.getAdapterPosition());
        }
    }
}

五、结语

通过以上步骤,我们就可以实现RecyclerView的长按拖拽排序功能。