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.