在RecyclerView中进行确认和撤消删除 [英] Confirmation and undo removing in RecyclerView

查看:203
本文介绍了在RecyclerView中进行确认和撤消删除的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在RecyclerView中得到了一些简单的物品清单.使用ItemTouchHelper,很容易实现滑动删除"行为.

I have got a list of simple items in RecyclerView. Using ItemTouchHelper it was very easy to implement "swipe-to-delete" behavior.

public class TripsAdapter extends RecyclerView.Adapter<TripsAdapter.VerticalItemHolder> {
    private List<Trip> mTrips;
    private Context mContext;
    private RecyclerView mRecyclerView;

    [...]

    //Let adapter know his RecyclerView. Attaching ItemTouchHelper
    @Override
    public void onAttachedToRecyclerView(RecyclerView recyclerView) {
        ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new TripItemTouchHelperCallback());
        itemTouchHelper.attachToRecyclerView(recyclerView);
        mRecyclerView = recyclerView;
    }

    [...]

    public class TripItemTouchHelperCallback extends ItemTouchHelper.SimpleCallback {
        public  TripItemTouchHelperCallback (){
            super(ItemTouchHelper.UP | ItemTouchHelper.DOWN, ItemTouchHelper.RIGHT);
        }

        @Override
        public boolean onMove(RecyclerView recyclerView,
                              RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
            //some "move" implementation
        }
        @Override
        public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) {
            //AND WHAT HERE?
        }
    }
}

效果很好.但是,我还需要执行一些撤消操作或确认.最好的方法是什么?

It works well. However i also need to implement some undo action or confirmation. What is the best way to do this?

第一个问题是如何在确认对话框中插入另一个视图以代替视图"?如果用户选择撤消删除操作,该如何恢复刷卡项目?

First question is how to insert another view in place of removed with confirmation dialog? And how to restore swiped item, if user chooses to undo removing?

推荐答案

我同意@Gabor的观点,最好是软删除项目并显示撤消"按钮.

I agree with @Gabor that it is better to soft delete the items and show the undo button.

但是我正在使用Snackbar来显示UNDO.对我来说,实施起来比较容易.

However I'm using Snackbar for showing the UNDO. It was easier to implement for me.

我将Adapter和RecyclerView实例传递给我的ItemTouchHelper回调.我的onSwiped很简单,大部分工作都是通过适配器完成的.

I'm passing the Adapter and the RecyclerView instance to my ItemTouchHelper callback. My onSwiped is simple and most of the work is done by adapter.

这是我的代码(编辑于2016/01/10 ):

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

适配器的onItemRemove方法是:

The onItemRemove methos of the adapter is:

   public void onItemRemove(final RecyclerView.ViewHolder viewHolder, final RecyclerView recyclerView) {
    final int adapterPosition = viewHolder.getAdapterPosition();
    final Photo mPhoto = photos.get(adapterPosition);
    Snackbar snackbar = Snackbar
            .make(recyclerView, "PHOTO REMOVED", Snackbar.LENGTH_LONG)
            .setAction("UNDO", new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    int mAdapterPosition = viewHolder.getAdapterPosition();
                    photos.add(mAdapterPosition, mPhoto);
                    notifyItemInserted(mAdapterPosition);
                    recyclerView.scrollToPosition(mAdapterPosition);
                    photosToDelete.remove(mPhoto);
                }
            });
    snackbar.show();
    photos.remove(adapterPosition);
    notifyItemRemoved(adapterPosition);
    photosToDelete.add(mPhoto);
}

photosToDelete是myAdapter的ArrayList字段.我正在对recyclerView主机片段的onPause()方法中的那些项进行真正的删除.

The photosToDelete is an ArrayList field of myAdapter. I'm doing the real delete of those items in onPause() method of the recyclerView host fragment.

请注意编辑2016/01/10 :

  • 更改了@Sourabh在评论中建议的硬编码位置
  • 有关带有RV的适配器和片段的完整示例,请参见此要点

这篇关于在RecyclerView中进行确认和撤消删除的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆