RecyclerView滑动删除

作者: zayn_xu | 来源:发表于2016-12-11 14:52 被阅读627次

tags: android RecyclerView

RecyclerView出来已经很久了,现在项目几乎所有的列表都换成RecyclerView。这里就不安利了,记一下使用RecyclerView实现item滑动删除之类的功能。


概要

RecyclerView的功能设计基本上都是低耦合的,扩展性很强。虽然RecyclerView本事并没有提供各种功能,但是依靠RecyclerView提供的接口,可以轻易的实现itemView移动删除的功能。

不过v7包里面还是提供了一些已经实现的功能,避免重新制造轮子。这里我们就是使用ItemTouchHelper实现这个功能。


涉及到的类:

  • ItemTouchHelper
    同时实现了OnItemTouchListener,ItemDecoration ,ChildAttachStateChangeListener的功能,比较复杂
  • ItemTouchHelper.Callback
    比较简单,主要是暴露ItemTouchHelper的功能给开发者使用。
  • ItemTouchUIUtil
    辅助类,方便使用ItemTouchHelper.Callback。

代码

read the fuck code

    ItemTouchHelper helper = new ItemTouchHelper(new ItemTouchHelper.Callback() {
        @Override
        public int getMovementFlags(RecyclerView rv, RecyclerView.ViewHolder vh) {
            return makeMovementFlags(0, ItemTouchHelper.RIGHT);
        }
        
        @Override
        public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
            int adapterPosition = viewHolder.getAdapterPosition();
            //根据adapterPosition移除item
            ...
        }
        @Override
        public void clearView(RecyclerView rv, RecyclerView.ViewHolder viewHolder) {
            getDefaultUIUtil().clearView(((MessageHolder) viewHolder).panel);
        }
        @Override
        public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {   
            if(viewHolder!=null){
                getDefaultUIUtil().onSelected(((MessageHolder) viewHolder).panel);
            }
        }
         @Override
        public void onChildDraw(Canvas c, RecyclerView recyclerView,
                                RecyclerView.ViewHolder viewHolder, float dX, float dY,
                                int actionState, boolean isCurrentlyActive) {
            getDefaultUIUtil().onDraw(c, recyclerView,
                        ((MessageHolder) viewHolder).panel, dX, dY,actionState, isCurrentlyActive);
        }
        @Override
        public void onChildDrawOver(Canvas c, RecyclerView recyclerView,
                                        RecyclerView.ViewHolder viewHolder, float dX, float dY,
                                        int actionState, boolean isCurrentlyActive) {
            getDefaultUIUtil().onDrawOver(c, recyclerView,
                        ((MessageHolder) viewHolder).panel, dX, dY,actionState, isCurrentlyActive);
        }
    });
    //绑定到recyclerView.
    helper.attachToRecyclerView(recyclerView);

代码都在这里了,一共几十行代码,主要是几个方法

  • int getMovementFlags(RecyclerView rv, RecyclerView.ViewHolder vh)
    设置移动的规则:移动的方向(上下左右),上下是拖动,左右是滑动。

  • onSwiped(RecyclerView.ViewHolder viewHolder, int direction)
    回调: 滑动结束后的回调,在这里做列表的数据操作

  • clearView(RecyclerView rv, RecyclerView.ViewHolder viewHolder)
    这是是标记要移除的Item的移动View

  • onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState)
    回调: 选择的item改变了的回调,换一个item移动的时候

  • onChildDraw(dx, dy)
    这个实际是ItemDecoration的onChildDraw()回传, 作用一样,这里根据dx,dy设置出clearview产生的动画,UiUtil里就是简单的位移。

  • onChildDrawOver(dx, dy)
    同上

结束

使用ItemTouchHelper可以轻松实现左右滑动的操作,同时可以看到,上下拖拽排序也可以用这个实现。

相关文章

网友评论

    本文标题:RecyclerView滑动删除

    本文链接:https://www.haomeiwen.com/subject/nmlpmttx.html