3

How can I show confirm dialog before deleting Recyclerview Item using ItemTouchHelper. I have create RecyclerView and implemented basic ItemTouchHelper.Callback class. But, I don't know what to do next.

I have created below class and attached it to Recyclerview. Swiping out the item works. But I want to show confirm dialog even before the item is moved.

class SwipeController extends Callback {

    public SwipeController( ) {

    }

    @Override
    public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
        return makeMovementFlags(0, START);
    }

    @Override
    public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
        return false;
    }

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

    }
}
Yesudass Moses
  • 1,739
  • 2
  • 24
  • 52

4 Answers4

9

Here is how I implemented the required behavior assuming the item will be deleted if "yes" is pressed and nothing done otherwise:

new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
        @Override
        public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
            return false;
        }

        // Called when a user swipes left or right on a ViewHolder
        @Override
        public void onSwiped(final RecyclerView.ViewHolder viewHolder, int swipeDir) {
            // Here is where you'll implement swipe to delete
            new AlertDialog.Builder(viewHolder.itemView.getContext())
                    .setMessage("Are you sure?")
                    .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            // Get the position of the item to be deleted
                            int position = viewHolder.getAdapterPosition();
                            // Then you can remove this item from the adapter 
                    })
                    .setNegativeButton("No", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            // User cancelled the dialog, 
                            // so we will refresh the adapter to prevent hiding the item from UI
                            mAdapter.notifyItemChanged(viewHolder.getAdapterPosition());
                        }
                    })
                    .create()
                    .show();
                }
            }).attachToRecyclerView(mRecyclerView);
AhmedAbdelaal
  • 236
  • 2
  • 5
2

In onSwiped, add AlertDialog with positive and negative button, with required action on each action. Sample code below:

    @Override
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
      AlertDialog.Builder builder = new AlertDialog.Builder(context);
      builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int arg1) {
          // Your action
          dialog.cancel();
        };
      });
      builder.setNegativeButton("CANCEL", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int arg1) {
          dialog.cancel();
        };
      });
    }
Gokul Nath KP
  • 13,135
  • 24
  • 77
  • 112
0
 @Override
public void onSwiped(final RecyclerView.ViewHolder viewHolder, int direction, int position) {

    Log.d(TAG, "onSwiped() position=" + position + " direction=" + direction);

    // get item details
    final String itemIndex = cartList.get(viewHolder.getAdapterPosition()).getIndex();
    String itemSubjekt = cartList.get(viewHolder.getAdapterPosition()).getSubjekt();
    String itemPrio = cartList.get(viewHolder.getAdapterPosition()).getPrio();



    // from right to left = delete line
    if ((viewHolder instanceof CartListAdapter.MyViewHolder) && (direction == 4)){

        Log.d(TAG, "onSwiped() delete");

        Context context = viewHolder.itemView.getContext();

        AlertDialog adDelete = new AlertDialog.Builder(context).create();
        adDelete.setTitle(context.getResources().getString(R.string.dialog_delete_nadpis));
        adDelete.setMessage(context.getResources().getString(R.string.dialog_delete_really));

        adDelete.setButton(DialogInterface.BUTTON_POSITIVE, "ANO", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {

                        Log.d(TAG, "Dialog delete - vybrano ANO");

                        final Item deletedItem = cartList.get(viewHolder.getAdapterPosition());
                        // final int deletedIndex = viewHolder.getAdapterPosition();

                        // code here to delete item in db



                }
        });
        adDelete.setButton(DialogInterface.BUTTON_NEGATIVE, "NE", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {

                            Log.d(TAG, "Dialog delete - vybrano NE");

                            mAdapter.notifyItemChanged(viewHolder.getAdapterPosition());

                        }
        });
        adDelete.show();


    }


    // from left to right = Edit line
    if ((viewHolder instanceof CartListAdapter.MyViewHolder) && (direction == 8)){

        Log.d(TAG, "onSwiped() edit");



    }


}
Josef Vancura
  • 785
  • 7
  • 16
0

thanks for @AhmedAbdelaal

kotlin version

    override fun onSwiped(viewHolder: RecyclerView.ViewHolder, i: Int) {
        if (enableConfirmDialogBeforeSwiped) {
            val alertDialogBuilder = AlertDialogBuilder(viewHolder.itemView.context)
            alertDialogBuilder.title("提示")
            alertDialogBuilder.message("确定删除该数据吗?")
            alertDialogBuilder.positiveButton("确定") {
                // remove this item
                mAdapter.onItemDismiss(viewHolder.adapterPosition)
            }
            alertDialogBuilder.negativeButton("取消") {
                // User cancelled the dialog, so we will refresh the adapter to prevent hiding the item from UI
                mAdapter.notifyItemChanged(viewHolder.adapterPosition)
            }
            alertDialogBuilder.show()
        } else {
            // remove this item
            mAdapter.onItemDismiss(viewHolder.adapterPosition)
        }
    }
Michael Mao
  • 222
  • 1
  • 8