RecyclerView侧滑删除,拖动排序
【摘要】 侧滑删除,拖动排序对于列表来说,交互方式不仅仅是上下左右滑动整个列表,点击,长按这些。RecyclerView中的项目,也支持侧滑和拖动等操作。监听到侧滑和拖动后,我们可以执行想要的操作。 示例目标:对于竖直的单项列表,左右滑动可删除选项,长按后拖动可改变选项位置。下面是运行效果图侧滑删除拖动排序可以明确的是,我们需要监听到2种动作,左右侧滑和拖动。为实现这个目标,我们可以使用官方提供的I...
侧滑删除,拖动排序
对于列表来说,交互方式不仅仅是上下左右滑动整个列表,点击,长按这些。
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进行绑定。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)