Android-RecyclerView添加拖拽功能
29 Dec 2018
RecyclerView添加拖拽排序功能
Demo地址:
https://github.com/pulque/DragListDemo
1. 实现功能
通过继承ItemTouchHelper实现对元素的拖拽,可以排序和侧滑删除。2. 实现步骤
继承ItemTouchHelper.Callback,重写方法进行设置。设置长按拖拽和横向滑动删除。
并对适配器回调方法,进行数据处理。
3. 关键代码
//设置回调ItemTouchHelper.Callback callback = new TouchHelperCallback(adapter);
//拖拽帮助类
ItemTouchHelper touchHelper = new ItemTouchHelper(callback);
//作用在列表上
touchHelper.attachToRecyclerView(binding.functionsList);
4. ItemTouchHelper.Callback说明
isLongPressDragEnabled()是否可以长按拖拽isItemViewSwipeEnabled()是否可以侧滑删除
getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder)
滑动的方式设置
当移动结束后回调onMove
当侧滑删除后回调onSwiped
5. 总结
其实ItemTouchHelper已经帮我们做了很多大量工作。如果不想长按来移动排序可以这样:
1.监听item view中setOnTouchListener的onTouch方法
2.通过接口将holder传给ItemTouchHelper
3.调用touchHelper.startDrag(holder)开始拖拽
代码:
public interface StartDragListener {
//触摸imageview,开启拖动的接口
void startDragItem(RecyclerView.ViewHolder holder);
}
BaseAdapter:
//set接口回调
public void setDragListener(StartDragListener dragListener) {
this.dragListener = dragListener;
}
holder.itemView.setOnTouchListener(new View.OnTouchListener() {
float x = 0;
float y = 0;
@Override
public boolean onTouch(View v, MotionEvent event) {
//注意:这里down和up都会回调该方法
if (event.getAction() == MotionEvent.ACTION_DOWN) {
x = event.getX();
y = event.getY();
} else if (event.getAction() == MotionEvent.ACTION_MOVE) {
float xTemp = event.getX();
float yTemp = event.getY();
if (xTemp - x > 5 || xTemp - x < -5 || yTemp - y > 5 || yTemp - y < -5) {
if (dragListener != null) {
dragListener.startDragItem(holder);
}
}
}
return false;
}
});
@Override
public void startDragItem(RecyclerView.ViewHolder holder) {
touchHelper.startDrag(holder);
}