DragDrop 和使用 RecyclerView 滑动

你可以使用 RecyclerView 实现滑动到关闭和拖放功能,而无需使用第三方库。
只需使用 RecyclerView 支持库中包含的 ItemTouchHelper 类。

使用 SimpleCallback 回调实例化 ItemTouchHelper,根据你支持的功能,你应该覆盖 onMove(RecyclerView, ViewHolder, ViewHolder) 和/或 onSwiped(ViewHolder, int) 并最终附加到你的 RecyclerView

ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {

    @Override
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) {
        // remove item from adapter
    }

    @Override
    public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
            final int fromPos = viewHolder.getAdapterPosition();
            final int toPos = target.getAdapterPosition();
            // move item in `fromPos` to `toPos` in adapter.
            return true;// true if moved, false otherwise
        }
    
};

ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback);
itemTouchHelper.attachToRecyclerView(recyclerView);

值得一提的是,SimpleCallback 构造函数将相同的滑动策略应用于 RecyclerView 中的所有项目。在任何情况下都可以通过简单地覆盖方法 getSwipeDirs(RecyclerView, ViewHolder) 来更新特定项目的默认滑动方向。

让我们假设我们的 RecyclerView 包含了一个 HeaderViewHolder,我们显然不想对它进行滑动。覆盖 getSwipeDirs 就足够了,如下所示:

@Override
public int getSwipeDirs(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
    if (viewHolder instanceof HeaderViewHolder) {
        // no swipe for header
        return 0;
    }
    // default swipe for all other items
    return super.getSwipeDirs(recyclerView, viewHolder);
}