RecyclerView侧滑删除,拖动排序

AnRFDev 发表于 2021/06/02 12:54:12 2021/06/02
【摘要】 侧滑删除,拖动排序对于列表来说,交互方式不仅仅是上下左右滑动整个列表,点击,长按这些。RecyclerView中的项目,也支持侧滑和拖动等操作。监听到侧滑和拖动后,我们可以执行想要的操作。 示例目标:对于竖直的单项列表,左右滑动可删除选项,长按后拖动可改变选项位置。下面是运行效果图侧滑删除拖动排序可以明确的是,我们需要监听到2种动作,左右侧滑和拖动。为实现这个目标,我们可以使用官方提供的I...

侧滑删除,拖动排序

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

示例

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

下面是运行效果图

侧滑删除 拖动排序
slide-delete-item.gif drag-to-swap.gif

可以明确的是,我们需要监听到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进行绑定。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。