使用ItemTouchHelper实现RecyclerView的Swipe to Dismiss行为

  ItemTouchHelper是用来为RecyclerView添加Swipe to Dismiss和Drag & Drop行为的帮助类,使用它可以很方便地实现对RecyclerView中item的扫动和拖拽动作。

  ItemTouchHelper通过ItemTouchHelper.Callback和你的具体应用进行交互,ItemTouchHelper.Callback负责控制所希望使用的功能(扫动、拖拽),以及扫动和拖拽事件发生时的回调。ItemTouchHelper.SimpleCallback是对ItemTouchHelper.Callback的一个简单地封装,提供了扫动和拖拽的基本功能。

  使用ItemTouchHelper时,只需要提供ItemTouchHelper.Callback,然后把ItemTouchHelper关联到RecyclerView上即可,如实现扫动移除的功能如图1所示:

图1

 

ItemTouchHelper itemTouchHelper = new ItemTouchHelper(
        new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.RIGHT) {
            @Override
            public boolean onMove(RecyclerView recyclerView,
                                  RecyclerView.ViewHolder viewHolder,
                                  RecyclerView.ViewHolder target) {
                return false;
            }
            @Override
            public boolean isItemViewSwipeEnabled() {
                return true;
            }
            @Override
            public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
                int position = viewHolder.getAdapterPosition();
                mData.remove(position);
                mAdapter.notifyItemRemoved(position);
            }
        });
itemTouchHelper.attachToRecyclerView(mRecyclerView);

这里使用了ItemTouchHelper.SimpleCallback,ItemTouchHelper.RIGHT 表示只支持向右扫动;isItemViewSwipeEnabled() 返回true 表示启用扫动功能;onSwiped() 是扫动发生时的回调,可以通过viewHolder.getAdapterPosition() 获得被扫动的item的位置,direction 为方向,这里从数据中移除对应元素后,使用notifyItemRemoved() 通知adapter;这里不支持拖拽,onMove() 没有做实现。

  如果仅使用上面的代码,会发现item被扫动并移除后,下面的item会瞬间上移,填补被移除item的空间,为了美观,可以使用Animator来添加过渡动画效果,如:

mRecyclerView.setItemAnimator(new DefaultItemAnimator());

虽然只是DefaultItemAnimator,当item被移除后,下面的item会慢慢上移,直到填补被移除item的空间。需要注意的是,要显示这种移除的动画效果,在移除数据后必须使用notifyItemRemoved() 来通知adapter。上面的完整代码可以参考这里