SoFunction
Updated on 2025-04-09

RecyclerView implements side-sliding drag function

This article shares the specific code for RecyclerView to implement the side-sliding drag function for your reference. The specific content is as follows

Prepare

ItemDragListener

package slideslipdrag;

import .;

/**
 * Created on 2018/7/22.
 *
 * @desc ItemDragListener
 */
public interface ItemDragListener {
 /**
   * Drag and drag
   *
   * @param viewHolder viewHolder
   */
 void onStartDrag( viewHolder);
}

ItemTouchHelperAdapter

package slideslipdrag;

/**
 * @decs: ItemTouchHelperAdapter
 * @date: 2018/7/22 13:23
 * @version: v 1.0
 */
public interface ItemTouchHelperAdapter {
 /**
   * move
   *
   * @param fromPosition Start position
   * @param toPosition Termination bit
   */
 void onItemMove(int fromPosition, int toPosition);

 /**
   * Sliding ends
   *
   * @param position
   */
 void onItemSlideSlipEnd(int position);
}

ItemTouchHelperViewHolder

package slideslipdrag;

import ;

/**
 * @decs: ItemTouchHelperViewHolder
 * @date: 2018/7/22 13:24
 * @version: v 1.0
 */
public interface ItemTouchHelperViewHolder {
  /**
    * Sliding starts
    *
    * @param context context
    */
  void onItemSlideSlipStart(Context context);

  /**
    * Sliding stop
    *
    * @param context context
    */
  void onItemSlideSlipStop(Context context);
}

SimpleItemTouchHelperCallback

package slideslipdrag;

import ;
import ;
import ;
import ;
import ;
import .;
import .;
import .;
import ;

import ;

import ;

/**
 * @decs: SimpleItemTouchHelperCallback
 * @date: 2018/7/22 13:34
 * @version: v 1.0
 */
public class SimpleItemTouchHelperCallback extends  {
  private final ItemTouchHelperAdapter mAdapter;
  private Context context;
  private Paint paint = new Paint();

  public SimpleItemTouchHelperCallback(ItemTouchHelperAdapter adapter, Context context) {
    mAdapter = adapter;
     = context;
  }

  @Override
  public boolean isLongPressDragEnabled() {
    return false;
  }

  @Override
  public boolean isItemViewSwipeEnabled() {
    return true;
  }

  @Override
  public int getMovementFlags(RecyclerView recyclerView,  viewHolder) {
    // Enable drag up and down and right swipe in right direction
    final int dragFlags =  | ;
    final int swipeFlags = ;
    // final int swipeFlags =  | ; Enable swipe in both direction
    return makeMovementFlags(dragFlags, swipeFlags);
  }

  @Override
  public long getAnimationDuration(RecyclerView recyclerView, int animationType, float animateDx, float animateDy) {
    // return animationType == ItemTouchHelper.ANIMATION_TYPE_DRAG ? DEFAULT_DRAG_ANIMATION_DURATION : DEFAULT_SWIPE_ANIMATION_DURATION;
    return animationType == ItemTouchHelper.ANIMATION_TYPE_DRAG ? DEFAULT_DRAG_ANIMATION_DURATION : 350;
  }

  @Override
  public boolean onMove(RecyclerView recyclerView,  source,  target) {
    if (() != ()) {
      return false;
    }
    // Notify the adapter of the move
    ((), ());
    return true;
  }

  @Override
  public void onChildDrawOver(Canvas c, RecyclerView recyclerView,  viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
    (c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
  }

  @Override
  public void onSwiped(final  viewHolder, int i) {
    // Notify the adapter of the dismissal
    (());
  }

  @Override
  public int getBoundingBoxMargin() {
    return ();
  }

  @Override
  public void onChildDraw(final Canvas c, RecyclerView recyclerView,  viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
    (c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
    // Fade out the view as it is swiped out of the parent's bounds
    if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {
      View itemView = ;
      Bitmap icon;
      if (dX > 0) {
        icon = ((), );
        // Set color for right swipe
        ((context, ));
        // Draw Rect with varying right side, equal to displacement dX
        ((float) () + (0), (float) (), dX + (0),
            (float) (), paint);
        // Set the image icon for right swipe
        (icon, (float) () + (16), (float) () +
            ((float) () - (float) () - ()) / 2, paint);
        ();
      }
    }
  }

  @Override
  public void onSelectedChanged( viewHolder, int actionState) {
    if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
      // Let the view holder know that this item is being moved or dragged
      ItemTouchHelperViewHolder itemViewHolder = (ItemTouchHelperViewHolder) viewHolder;
      (context);
    }
    (viewHolder, actionState);
    /*final boolean swiping = actionState == ItemTouchHelper.ACTION_STATE_SWIPE;
    (!swiping);*/
  }

  @Override
  public void clearView(RecyclerView recyclerView,  viewHolder) {
    (recyclerView, viewHolder);
    // Tell the view holder it's time to restore the idle state
    ItemTouchHelperViewHolder itemViewHolder = (ItemTouchHelperViewHolder) viewHolder;
    (context);

  }

  @Override
  public float getMoveThreshold( viewHolder) {
    /*return (viewHolder);*/
    return 0.1f;
    /*return (0.5f);*/
  }

  @Override
  public float getSwipeThreshold( viewHolder) {
    /*if (viewHolder instanceof ) {
      return 1f;
    }
    return (viewHolder);*/
    return 0.9f;
  }
}

use

layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:andro
  xmlns:tools="/tools"
  android:
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:background="@drawable/white_gray_button_en_r_selector"
  android:descendantFocusability="blocksDescendants"
  android:orientation="vertical">

  <RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingBottom="@dimen/d18"
    android:paddingLeft="@dimen/d12"
    android:paddingRight="@dimen/d12"
    android:paddingTop="@dimen/d18">

    <TextView
      android:
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_centerVertical="true"
      android:textColor="@color/fontInput"
      android:textSize="@dimen/s14"
      tools:text="First Project Department" />

    <ImageView
      android:
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_alignParentEnd="true"
      android:layout_alignParentRight="true"
      android:layout_centerVertical="true"
      android:contentDescription="@string/toDo"
      android:src="@drawable/dehaze"
      android:visibility="invisible" />

    <CheckBox
      android:
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_alignParentEnd="true"
      android:layout_alignParentRight="true"
      android:layout_centerVertical="true"
      android:button="@drawable/checkbox_image_selector" />
  </RelativeLayout>

  <View
    android:layout_width="match_parent"
    android:layout_height="@dimen/px1"
    android:layout_marginLeft="@dimen/d12"
    android:layout_marginStart="@dimen/d12"
    android:background="@color/gray" />
</LinearLayout>

adapter

package ;

import ;
import ;
import ;
import ;
import .;
import .;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;

import ;

import ;
import ;
import ;

import ;
import ;
import ;
import ;
import ;
import ;
import ;

/**
  * Created on 2018/6/27.
  *
  * @desc Parameter Configuration Selection (Stratigraphic)
  */
public class ParaConfigChooseGroundAdapter extends <> implements , , ItemTouchHelperAdapter {
  private Context context;
  private List<Ground> groundList;
  private int viewStateReceive;
  private OnRecyclerViewItemClickListener mOnItemClickListener;
  private OnRecyclerViewItemLongClickListener mOnItemLongClickListener;
  private final ItemDragListener dragStartListener;
  private int selectPosition = -1;

  /**
    * constructor
    *
    * @param context context
    * @param viewState view shape (0 select 1 without selection)
    * @param dragStartListener Drag and listen
    */
  public ParaConfigChooseGroundAdapter(Context context, int viewState, ItemDragListener dragStartListener) {
     = context;
     = dragStartListener;
    groundList = new ArrayList<>();
    viewStateReceive = viewState;
  }

  private void setSelectPosition(int selectPosition) {
     = selectPosition;
  }

  public void setParaConfigChooseGroundData(List<Ground> list) {
     = list;
  }

  @Override
  public int getItemCount() {
    if (groundList != null && () > 0) {
      return ();
    }
    return 0;
  }

  @Override
  public void onClick(View v) {
    if (mOnItemClickListener != null) {
      // Method getTag which get data.
      (v, (Ground) ());
    }
  }

  @Override
  public boolean onLongClick(View v) {
    if (mOnItemLongClickListener != null) {
      // Method getTag which get data.
      (v, (Ground) ());
    }
    return true;
  }

  public void setOnItemClickListener(OnRecyclerViewItemClickListener listener) {
     = listener;
  }

  public void setOnItemLongClickListener(OnRecyclerViewItemLongClickListener listener) {
     = listener;
  }

  @NonNull
  @Override
  public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    // If inflate(.list_item_record,parent,false) is not written like this, the cardview will not be wide    View view = (context).inflate(.basic_config_choose_item, parent, false);
    // Register click event for the created View    (this);
    (this);
    return new ViewHolder(view);
  }

  @SuppressLint("ClickableViewAccessibility")
  @Override
  public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {
    final Ground ground = (position);
    // Store the data in itemView tag for clicking    (ground);
    // Value    (());
    switch (viewStateReceive) {
      case 0:
        // Select No        if (selectPosition == position) {
          (true);
        } else {
          (false);
        }
        // CheckBox
        (new () {
          @Override
          public void onClick(View v) {
            if (selectPosition == ()) {
              // Select Cancel              setSelectPosition(-1);
              (ground, false);
            } else {
              // If not selected, select              setSelectPosition(());
              (ground, true);
            }
            notifyDataSetChanged();
          }
        });
        // ConvertView
        (new () {
          @Override
          public void onClick(View v) {
            if (selectPosition == ()) {
              // Select Cancel              setSelectPosition(-1);
              (ground, false);
            } else {
              // If not selected, select              setSelectPosition(());
              (ground, true);
            }
            notifyDataSetChanged();
          }
        });
        break;
      case 1:
        ();
        ();
        break;
      default:
        break;
    }
    (new () {
      @Override
      public boolean onTouch(View v, MotionEvent event) {
        switch (()) {
          case MotionEvent.ACTION_DOWN:
            (holder);
            break;
          default:
            break;
        }
        return false;
      }
    });
  }

  @Override
  public void onItemMove(int fromPosition, int toPosition) {
    if (fromPosition < toPosition) {
      for (int i = fromPosition; i < toPosition; i++) {
        (groundList, i, i + 1);
      }
    } else {
      for (int i = fromPosition; i > toPosition; i--) {
        (groundList, i, i - 1);
      }
    }
    notifyItemMoved(fromPosition, toPosition);
  }

  @Override
  public void onItemSlideSlipEnd(int position) {
    Ground ground = (position);
    switch (()) {
      case 1:
        notifyItemRemoved(position);
        (position);
        notifyItemRangeChanged(0, getItemCount());
        ();
        break;
      default:
        notifyItemRangeChanged(0, getItemCount());
        (());
        break;
    }
  }

  public interface OnRecyclerViewItemClickListener {
    /**
      * Shorter
      *
      * @param view view
      * @param ground data
      */
    void onItemClick(View view, Ground ground);

    /**
      * Short point (select)
      *
      * @param ground data
      * @param choose No
      */
    void onItemChoose(Ground ground, boolean choose);
  }

  public interface OnRecyclerViewItemLongClickListener {
    /**
      * Longer
      *
      * @param view view
      * @param ground data
      */
    void onItemLongClick(View view, Ground ground);
  }

  /**
    * Custom ViewHolder (holds all elements per Item page)
    */
  class ViewHolder extends  implements ItemTouchHelperViewHolder {
    @BindView()
    LinearLayout llBasicConfigChoose;
    @BindView()
    TextView tvBasicConfigChoose;
    @BindView()
    ImageView ivBasicConfigChoose;
    @BindView()
    CheckBox cbBasicConfigChoose;

    ViewHolder(final View view) {
      super(view);
      (this, view);
    }

    @Override
    public void onItemSlideSlipStart(Context context) {
      ((context, ));
      ((context, ));
      ((context, ), .SRC_IN);
    }

    @Override
    public void onItemSlideSlipStop(Context context) {
      ((context, ));
      ((context, ));
      ((context, ), .SRC_IN);
    }
  }
}

Main code

package ;

import ;
import ;
import ;
import ;
import .;
import .;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;

import ;

import ;
import ;
import ;

import ;
import ;
import ;
import ;
import ;
import ;
import ;

/**
  * Created on 2018/6/27.
  *
  * @author Zheng Shaopeng
  * @desc Parameter Configuration Selection (Stratigraphic)
  */
public class ParaConfigChooseGroundAdapter extends <> implements , , ItemTouchHelperAdapter {
  private Context context;
  private List<Ground> groundList;
  private int viewStateReceive;
  private OnRecyclerViewItemClickListener mOnItemClickListener;
  private OnRecyclerViewItemLongClickListener mOnItemLongClickListener;
  private final ItemDragListener dragStartListener;
  private int selectPosition = -1;

  /**
    * constructor
    *
    * @param context context
    * @param viewState view shape (0 select 1 without selection)
    * @param dragStartListener Drag and listen
    */
  public ParaConfigChooseGroundAdapter(Context context, int viewState, ItemDragListener dragStartListener) {
     = context;
     = dragStartListener;
    groundList = new ArrayList<>();
    viewStateReceive = viewState;
  }

  private void setSelectPosition(int selectPosition) {
     = selectPosition;
  }

  public void setParaConfigChooseGroundData(List<Ground> list) {
     = list;
  }

  @Override
  public int getItemCount() {
    if (groundList != null && () > 0) {
      return ();
    }
    return 0;
  }

  @Override
  public void onClick(View v) {
    if (mOnItemClickListener != null) {
      // Method getTag which get data.
      (v, (Ground) ());
    }
  }

  @Override
  public boolean onLongClick(View v) {
    if (mOnItemLongClickListener != null) {
      // Method getTag which get data.
      (v, (Ground) ());
    }
    return true;
  }

  public void setOnItemClickListener(OnRecyclerViewItemClickListener listener) {
     = listener;
  }

  public void setOnItemLongClickListener(OnRecyclerViewItemLongClickListener listener) {
     = listener;
  }

  @NonNull
  @Override
  public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    // If inflate(.list_item_record,parent,false) is not written like this, the cardview will not be wide    View view = (context).inflate(.basic_config_choose_item, parent, false);
    // Register click event for the created View    (this);
    (this);
    return new ViewHolder(view);
  }

  @SuppressLint("ClickableViewAccessibility")
  @Override
  public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {
    final Ground ground = (position);
    // Store the data in itemView tag for clicking    (ground);
    // Value    (());
    switch (viewStateReceive) {
      case 0:
        // Select No        if (selectPosition == position) {
          (true);
        } else {
          (false);
        }
        // CheckBox
        (new () {
          @Override
          public void onClick(View v) {
            if (selectPosition == ()) {
              // Select Cancel              setSelectPosition(-1);
              (ground, false);
            } else {
              // If not selected, select              setSelectPosition(());
              (ground, true);
            }
            notifyDataSetChanged();
          }
        });
        // ConvertView
        (new () {
          @Override
          public void onClick(View v) {
            if (selectPosition == ()) {
              // Select Cancel              setSelectPosition(-1);
              (ground, false);
            } else {
              // If not selected, select              setSelectPosition(());
              (ground, true);
            }
            notifyDataSetChanged();
          }
        });
        break;
      case 1:
        ();
        ();
        break;
      default:
        break;
    }
    (new () {
      @Override
      public boolean onTouch(View v, MotionEvent event) {
        switch (()) {
          case MotionEvent.ACTION_DOWN:
            (holder);
            break;
          default:
            break;
        }
        return false;
      }
    });
  }

  @Override
  public void onItemMove(int fromPosition, int toPosition) {
    if (fromPosition < toPosition) {
      for (int i = fromPosition; i < toPosition; i++) {
        (groundList, i, i + 1);
      }
    } else {
      for (int i = fromPosition; i > toPosition; i--) {
        (groundList, i, i - 1);
      }
    }
    notifyItemMoved(fromPosition, toPosition);
  }

  @Override
  public void onItemSlideSlipEnd(int position) {
    Ground ground = (position);
    switch (()) {
      case 1:
        notifyItemRemoved(position);
        (position);
        notifyItemRangeChanged(0, getItemCount());
        ();
        break;
      default:
        notifyItemRangeChanged(0, getItemCount());
        (());
        break;
    }
  }

  public interface OnRecyclerViewItemClickListener {
    /**
      * Shorter
      *
      * @param view view
      * @param ground data
      */
    void onItemClick(View view, Ground ground);

    /**
      * Short point (select)
      *
      * @param ground data
      * @param choose No
      */
    void onItemChoose(Ground ground, boolean choose);
  }

  public interface OnRecyclerViewItemLongClickListener {
    /**
      * Longer
      *
      * @param view view
      * @param ground data
      */
    void onItemLongClick(View view, Ground ground);
  }

  /**
    * Custom ViewHolder (holds all elements per Item page)
    */
  class ViewHolder extends  implements ItemTouchHelperViewHolder {
    @BindView()
    LinearLayout llBasicConfigChoose;
    @BindView()
    TextView tvBasicConfigChoose;
    @BindView()
    ImageView ivBasicConfigChoose;
    @BindView()
    CheckBox cbBasicConfigChoose;

    ViewHolder(final View view) {
      super(view);
      (this, view);
    }

    @Override
    public void onItemSlideSlipStart(Context context) {
      ((context, ));
      ((context, ));
      ((context, ), .SRC_IN);
    }

    @Override
    public void onItemSlideSlipStop(Context context) {
      ((context, ));
      ((context, ));
      ((context, ), .SRC_IN);
    }
  }
}

The above is all the content of this article. I hope it will be helpful to everyone's study and I hope everyone will support me more.