使用RecyclerView在android中拖放

使用RecyclerView在android中拖放,android,Android,我是android开发新手,我想创建一个具有拖放功能的应用程序。条件是当我拖动一个项目直到我们将该项目拖放到任何位置时,该拖动视图的位置必须为空。我通过ItemTouchHelper解决了同样的问题。理解之后,它虽然有点小,但很复杂,但很简单。假设您有一个名为mRecyclerView的recycleView public void initRecycleView(){ //initiate your recycleView here .... mRecyclerView.setAdap

我是android开发新手,我想创建一个具有拖放功能的应用程序。条件是当我拖动一个项目直到我们将该项目拖放到任何位置时,该拖动视图的位置必须为空。

我通过ItemTouchHelper解决了同样的问题。理解之后,它虽然有点小,但很复杂,但很简单。假设您有一个名为mRecyclerView的recycleView

public void initRecycleView(){
  //initiate your recycleView here ....
  mRecyclerView.setAdapter(your_recycleView_adapter));
  ItemTouchHelper touchHelper = new ItemTouchHelper(rvCallback);
  touchHelper.attachToRecyclerView(mRecyclerView);
}

int dragStartFromPosition = -1;
ItemTouchHelper.Callback rvCallback = new ItemTouchHelper.Callback() {

    int dragFromPosition = -1;
    int dragToPosition = -1;

    @Override
    public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
        final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
        //final int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;
        return makeMovementFlags(dragFlags, 0);
    }


    @Override
    public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {

        if (dragFromPosition == -1) { //For Saving drag start from position
            dragStartFromPosition = viewHolder.getAdapterPosition();
        }

        dragFromPosition = viewHolder.getAdapterPosition();
        dragToPosition = target.getAdapterPosition();
        moveItem(dragFromPosition, dragToPosition);
        dragFromPosition = dragToPosition;
        dragToPosition = -1;
        return true;
    }

    @Override
    public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
        super.clearView(recyclerView, viewHolder);

        if (dragFromPosition != -1 && dragToPosition != -1 && dragFromPosition != dragToPosition) {
            finalMoved(dragFromPosition, dragToPosition);
        } else {
            moveItem(dragFromPosition, dragStartFromPosition);
            dragStartFromPosition = -1;
        }
        dragFromPosition = dragToPosition = -1;
    }

    private void finalMoved(int from, int to) {
            moveAlertDialog(from, to);
    }

    @Override
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
    }

    @Override
    public void onChildDrawOver(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
        super.onChildDrawOver(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
    }

    @Override
    public boolean isLongPressDragEnabled() {
        return true;
    }

};

private void moveItem(int from, int to) {
    Collections.swap(itemArrayList, from, to);
    rvAdapter.notifyItemMoved(from, to);
}

public void moveAlertDialog(final int from, final int to) {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage("Do you want to move this item?");
    builder.setPositiveButton("move", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
            dragStartFromPosition = -1;
        }
    });
    builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
            moveItem(from, dragStartFromPosition);
            dragStartFromPosition = -1;
        }
    });
    builder.show();
}
如果遇到任何问题,请随时提问。

谢谢

如果你想在recycler视图中拖动view而不是refr此链接,你必须解释更多内容以及你已经尝试过的示例。向我们展示一些努力@RishikeshRahi@shohan-艾哈迈德·西扬,实际上,我将视图从一个位置拖到了另一个位置,但问题是..我希望当我没有将它放在某个位置时,将被拖的项目移到它以前的位置。@Mohit Suthar感谢您的帮助。它工作得很好。