转载请标明出处:
https://blog.csdn.net/AnalyzeSystem/article/details/80165740
本文出自AnalyzeSystem的博客
撸这篇博客只是因为下篇博客卡片分析开源库所需,无他为学习尔
RecyclerView的Item可上线左右拖拽,实现起来也比较简单,这里需要用到ItemTouchHelper.Callback类
public abstract static class Callback {
@Override
public boolean isItemViewSwipeEnabled() {
return true;
}
@Override
public boolean isLongPressDragEnabled() {
return true;
}
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
//TODO
int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;
return makeMovementFlags(dragFlags, swipeFlags);
}
@Override
public boolean onMove(RecyclerView recyclerView,
RecyclerView.ViewHolder viewHolder,
RecyclerView.ViewHolder target) {
//TODO
return false;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
//TODO
}
}
重写getMovementFlags()方法设置拖放和滑动的方向。使用ItemTouchHelper.makeMovementFlags(int, int)来构造返回的flag。支持长按RecyclerView item进入拖动操作,你必须在isLongPressDragEnabled()方法中返回true,在view任意位置触摸时启用滑动操作isItemViewSwipeEnabled()方法中返回true
@Override
public boolean isLongPressDragEnabled() {
return true;
}
@Override
public boolean isItemViewSwipeEnabled() {
return true;
}
onSwiped、onMove函数回调,adapter做相应的数据处理,并调用notifyItemRemoved()和 notifyItemMoved()各自对应函数更新UI.这里补充一个基础知识点:
//把集合内的元素进行位置交换
Collections.swap(list,i,j)
最后利用ItemTouchHeper把Callback绑定到RecyclerView就ok了,这样一个简单地上下拖拽左右滑动删除就实现了.
ItemTouchHelper.Callback callback =
new SimpleItemTouchHelperCallback();
ItemTouchHelper touchHelper = new ItemTouchHelper(callback);
touchHelper.attachToRecyclerView(recyclerView);
之前发现一篇app端图文混排编辑器相关的Blog地址如下
当你了解ItemTouchHelper.Callback使用后你有没有觉得如此简单呢?
我们常用的QQ消息列表,支持左右滑动弹出删除、置顶相关UI,以前的实现方案都是SwipeMenu之类的开源库来实现,现在用ItemTouchHelper辅助实现更简单了,滑动删除逻辑修改判断值getWidth/2改为删除、置顶等功能的parent.getWidth/2,Item的滑动删除动画是针对的整个View,要实现QQ的滑动删除效果,我们需要的是内容偏移,这样底部的删除置顶功能就出来了。
RecyclerView 在Touch的时候需要取消每个Item的删除显示,防止复用误差问题。
最后在推荐一个开源库,可以更好地帮助你理解ItemTouchHelper、Callback