-
Notifications
You must be signed in to change notification settings - Fork 5.2k
拖拽功能(DragAndSwipeDataCallback)
mumu edited this page Apr 20, 2023
·
1 revision
#DragAndSwipeDataCallback 此类是实现拖拽功能的关键 #基本使用 ####1.使用默认方式的拖拽功能,可参考DefaultDragAndSwipeActivity类使用
######1.在你的adapter中,实现 DragAndSwipeDataCallback 接口。
public class DragAndSwipeAdapter extends BaseQuickAdapter<String, QuickViewHolder> implements DragAndSwipeDataCallback {
@NonNull
@Override
protected QuickViewHolder onCreateViewHolder(@NonNull Context context, @NonNull ViewGroup parent, int viewType) {
return new QuickViewHolder(R.layout.item_draggable_view, parent);
}
@Override
protected void onBindViewHolder(@NonNull QuickViewHolder holder, int position, String item) {
}
@Override
public void dataSwap(int fromPosition, int toPosition) {
swap(fromPosition, toPosition);
}
@Override
public void dataRemoveAt(int position) {
removeAt(position);
}
}
######2.在实现的adapter类中重写dataSwap 与 dataRemoveAt方法中, 进行拖拽与侧滑删除。
@Override
public void dataSwap(int fromPosition, int toPosition) {
swap(fromPosition, toPosition);
}
@Override
public void dataRemoveAt(int position) {
removeAt(position);
}
dataSwap : 拖拽交换数据时调用。 removeAt:侧滑删除时,调用。
######3.创建QuickDragAndSwipe 对象
QuickDragAndSwipe quickDragAndSwipe =new QuickDragAndSwipe()
.setDragMoveFlags(ItemTouchHelper.UP | ItemTouchHelper.DOWN)//可进行上下拖动,交换位置。 ItemTouchHelper.LEFT 允许向左拖动,ItemTouchHelper.RIGHT 允许向右拖动
.setSwipeMoveFlags(ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT);//可进行左右滑动删除
######4.附加到recyclerView中
quickDragAndSwipe.attachToRecyclerView(recyclerView)
.setDataCallback(mAdapter)
.setItemDragListener(listener)
.setItemSwipeListener(swipeListener);
######到此,默认方式的拖拽实现方式,已完成。
####2.根据需求,定制使用,第1、2步与默认使用方式相同。具体可参考DefaultDragAndSwipeActivity类使用
######3.创建QuickDragAndSwipe 对象
QuickDragAndSwipe quickDragAndSwipe =new QuickDragAndSwipe()
.setDragMoveFlags(ItemTouchHelper.UP | ItemTouchHelper.DOWN)//可进行上下拖动,交换位置。 ItemTouchHelper.LEFT 允许向左拖动,ItemTouchHelper.RIGHT 允许向右拖动
.setSwipeMoveFlags(ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT)//可进行左右滑动删除
.setItemViewSwipeEnabled(false)//关闭侧滑删除功能
.setLongPressDragEnabled(false);//关闭默认的长按拖拽功能,通过自定义长按事件进行拖拽
######4.附加到recyclerView中
quickDragAndSwipe.attachToRecyclerView(recyclerView)
.setDataCallback(mAdapter)
.setItemDragListener(listener)
.setItemSwipeListener(swipeListener);
######5.设置监听,并进行自主拖拽交换与测换删除
mAdapter.setOnItemClickListener((adapter, view, position) -> {
Tips.show("点击了:" + position + ",侧滑可进行删除" + position);
quickDragAndSwipe.startSwipe(position);//点击后,允许侧滑删除功能
});
mAdapter.setOnItemLongClickListener((adapter, view, position) -> {
/*
* 长按默认可拖动,可不进行设置此方法
* 此方法可以做特殊使用进行调用
* 如:长按此条position对应的item,触发 position+1 对应的item
* 此处使用,关闭了默认长按拖拽功能
*/
Tips.show("长按了:" + position + ",现在拖动可进行变换位置");
quickDragAndSwipe.startDrag(position);//长按后,允许进行拖拽
return false;
});
####3.根据需求,不允许某个类型的itemView,进行拖拽与侧滑功能。第1、2步与默认使用方式相同,具体可参考HeaderDragAndSwipeActivity类使用
######3.创建QuickDragAndSwipe 对象
/**
继承QuickDragAndSwipe类,重写getMovementFlags 方法,禁止某个类型的itemView进行拖拽与侧滑
**/
class HeaderDragAndSwipe : QuickDragAndSwipe() {
override fun getMovementFlags(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder
): Int {
if (recyclerView.adapter is ConcatAdapter) {
val adapter = recyclerView.adapter as ConcatAdapter
val absoluteAdapter =
adapter.getWrappedAdapterAndPosition(viewHolder.absoluteAdapterPosition).first
if (absoluteAdapter is HeaderDragAndSwipeAdapter) {
return super.getMovementFlags(recyclerView, viewHolder)
}
return makeMovementFlags(0, 0)
}
return makeMovementFlags(0, 0)
}
}
######4.附加到recyclerView中
quickDragAndSwipe.attachToRecyclerView(recyclerView)
.setDataCallback(mAdapter)
.setItemDragListener(listener)
.setItemSwipeListener(swipeListener);
######到此,特殊itemView类型,不允许拖拽实现方式,已完成。