跳转至

Android RecyclerView 侧滑删除,拖动排序

对于列表来说,交互方式不仅仅是上下左右滑动整个列表,点击,长按这些。 RecyclerView中的项目,也支持侧滑和拖动等操作。 监听到侧滑和拖动后,我们可以执行想要的操作。

示例

目标:对于竖直的单项列表,左右滑动可删除选项,长按后拖动可改变选项位置。

下面是运行效果图

侧滑删除 拖动排序

可以明确的是,我们需要监听到2种动作,左右侧滑和拖动。 为实现这个目标,我们可以使用官方提供的ItemTouchHelper

主要关注ItemTouchHelper.Callback类。ItemTouchHelper.Callback是一个抽象类,先来了解它的以下3个方法。

  • getMovementFlags 在此方法里面我们需要构建两个flag,一个是dragFlags,表示拖动效果支持的方向,另一个是swipeFlags,表示侧滑效果支持的方向。在我们的Demo中,拖动执行上下两个方向,侧滑执行左右两个方向,这些操作我们都可以在此方法里面定义。
  • onMove 当拖动事件已发生,会回调此方法。在此方法里面,我们通常会更新数据源。例如,一个ItemView从0拖到了1位置,那么对应的数据源也需要更改位置。
  • onSwiped 当侧滑事件已发生,会回调此方法。在此方法里面,我们也会更新数据源。与onMove方法不同到的是,我们在这个方法里面从数据源里面移除相应的数据,然后调用notifyXXX方法。

我们新建ReViewTouchCallback类,继承ItemTouchHelper.Callback

public class ReViewTouchCallback extends ItemTouchHelper.Callback {

    private final IActionListener mIActionListener;

    public ReViewTouchCallback(IActionListener IActionListener) {
        mIActionListener = IActionListener;
    }

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

    @Override
    public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
        return mIActionListener.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition());
    }

    @Override
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
        mIActionListener.onItemRemove(viewHolder.getAdapterPosition());
    }
}
复写了3个主要的方法,并将回调值传出来。

其中IActionListener是我们设计的监听器

public interface IActionListener {
    boolean onItemMove(int pos, int targetPos);

    void onItemRemove(int pos);
}

在activity中实际使用。监听到侧滑或者拖动事件时,对数据列表进行操作。

// onCreated方法中进行设置
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new ReViewTouchCallback(new IActionListener() {
    @Override
    public boolean onItemMove(int src, int target) {
        Collections.swap(mAdapter.getDataList(), src, target);
        mAdapter.notifyItemMoved(src, target);
        return true;
    }

    @Override
    public void onItemRemove(int pos) {
        mAdapter.getDataList().remove(pos);
        mAdapter.notifyItemRemoved(pos);
    }
}));
itemTouchHelper.attachToRecyclerView(binding.reView);
移动item,需要调用Adapter的notifyItemMoved方法。 RecyclerView会有一个过渡动画。

监听到删除操作时,将数据列表里的元素删除掉。然后调用Adapter的notifyItemRemoved方法。 同样会有一个删除的过渡动画。

在初始化的时候,需要调用attachToRecyclerView与RecyclerView进行绑定。

本文也发布在

华为云社区

本站说明

一起在知识的海洋里呛水吧。广告内容与本站无关。如果喜欢本站内容,欢迎投喂作者,谢谢支持服务器。如有疑问和建议,欢迎在下方评论~

📖AndroidTutorial 📚AndroidTutorial 🙋反馈问题 🔥最近更新 🍪投喂作者

Ads