美文网首页
RecycleView使用ItemTouchHelper实现侧滑

RecycleView使用ItemTouchHelper实现侧滑

作者: Dane_404 | 来源:发表于2019-03-19 23:14 被阅读0次

浏览博客发现有个ItemTouchHelper可以轻松实现侧滑删除和条目拖拽效果,代码非常简单,亲测有效:

    //为RecycleView绑定触摸事件
    ItemTouchHelper helper = new ItemTouchHelper(new ItemTouchHelper.Callback() {
        @Override
        public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
            //侧滑删除
            int swipeFlags = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
            //拖拽
            int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;

            //makeMovementFlags 参数一:拖拽事件  参数二:滑动事件
            return makeMovementFlags(dragFlags, swipeFlags);
        }

        //滑动事件
        @Override
        public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
            //交换list两个位置的内容
            Collections.swap(mList, viewHolder.getAdapterPosition(), target.getAdapterPosition());
            mMyAdapter.notifyItemMoved(viewHolder.getAdapterPosition(), target.getAdapterPosition());
            return true;
        }

        //侧滑事件
        @Override
        public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
            mList.remove(viewHolder.getAdapterPosition());
            mMyAdapter.notifyItemRemoved(viewHolder.getAdapterPosition());
        }

         @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);
            Log.d("----",dX+"---"+dY);
            if (dX != 0 && dY != 0 || isCurrentlyActive) {
            //长按拖拽时底部绘制一个虚线矩形
           c.drawRect(viewHolder.itemView.getLeft(),viewHolder.itemView.getTop(),viewHolder.itemView.getRight(),viewHolder.itemView.getBottom(),mPaint);
            }
           }

         @Override
        public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
            super.onSelectedChanged(viewHolder, actionState);
            if(actionState==ACTION_STATE_DRAG){
                //长按时调用
                ChannelAdapter.ChannelHolder holder= (ChannelAdapter.ChannelHolder) viewHolder;
                holder.name.setBackgroundColor(Color.parseColor("#FDFDFE"));
                holder.delete.setVisibility(View.GONE);
                holder.name.setElevation(5f);
           }
        }
        @Override
         public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
            super.clearView(recyclerView, viewHolder);
            ChannelAdapter.ChannelHolder holder= (ChannelAdapter.ChannelHolder) viewHolder;
            holder.name.setBackgroundColor(Color.parseColor("#f0f0f0"));
            holder.name.setElevation(0f);
            holder.delete.setVisibility(View.VISIBLE);
        }
        @Override
        public boolean isLongPressDragEnabled() {
            //是否可拖拽
            return true;
        }
    });
    //绑定
    DefaultItemAnimator animator = new DefaultItemAnimator();
    animator.setMoveDuration(300);     //设置动画时间
    animator.setRemoveDuration(0);
    mRecyclerView.setItemAnimator(animator);
    helper.attachToRecyclerView(mRecyclerView);

相关文章

网友评论

      本文标题:RecycleView使用ItemTouchHelper实现侧滑

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