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());
}
}
其中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);
notifyItemMoved
方法。
RecyclerView会有一个过渡动画。
监听到删除操作时,将数据列表里的元素删除掉。然后调用Adapter的notifyItemRemoved
方法。
同样会有一个删除的过渡动画。
在初始化的时候,需要调用attachToRecyclerView
与RecyclerView进行绑定。
本文也发布在
本站说明
一起在知识的海洋里呛水吧。广告内容与本站无关。如果喜欢本站内容,欢迎投喂作者,谢谢支持服务器。如有疑问和建议,欢迎在下方评论~