Skip to content

拖拽功能(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类型,不允许拖拽实现方式,已完成。