第七篇为滑动和拖拽,滑动删除分两种实现方式
第一种
package com.example.recyclerview.recycler.slide;
import android.annotation.SuppressLint;
import android.graphics.Canvas;
import android.view.MotionEvent;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.RecyclerView;
import com.example.recyclerview.recycler.BaseQuickAdapter;
import com.example.recyclerview.recycler.BaseViewHolder;
import java.util.Collections;
import java.util.List;
public abstract class BaseSlideAdapter<T, VH extends BaseViewHolder> extends BaseQuickAdapter<T, VH> {
//会报The key must be an application-specific resource id.修改成唯一
public static final int TAG = 0x10000000;
private static final int NO_TOGGLE_VIEW = 0;
private int mToggleViewId = NO_TOGGLE_VIEW;
private ItemTouchHelper mItemTouchHelper;
private boolean itemDragEnabled = false;
private boolean itemSwipeEnabled = false;
private OnItemDragListener mOnItemDragListener;
private OnItemSwipeListener mOnItemSwipeListener;
private boolean mDragOnLongPress = true;
private View.OnTouchListener mOnToggleViewTouchListener;
private View.OnLongClickListener mOnToggleViewLongClickListener;
public BaseSlideAdapter(int layoutResId, List<T> data) {
super(layoutResId, data);
}
@Override
public void onBindViewHolder(@NonNull VH holder, int position) {
super.onBindViewHolder(holder, position);
if (mItemTouchHelper != null && itemDragEnabled) {
if (mToggleViewId != NO_TOGGLE_VIEW) {
View toggleView = holder.getView(mToggleViewId);
if (toggleView != null) {
toggleView.setTag(TAG, holder);
if (mDragOnLongPress) {
toggleView.setOnLongClickListener(mOnToggleViewLongClickListener);
} else {
toggleView.setOnTouchListener(mOnToggleViewTouchListener);
}
}
} else {
holder.itemView.setTag(TAG, holder);
holder.itemView.setOnLongClickListener(mOnToggleViewLongClickListener);
}
}
}
public int getViewHolderPosition(RecyclerView.ViewHolder viewHolder) {
return viewHolder.getAdapterPosition();
}
/*******************************************************拖动*****************************************************************/
/**
* 开启拖动item功能
* 长按时使用itemView作为toggleView。
*
* @param itemTouchHelper {@link ItemTouchHelper}
*/
public void enableDragItem(@NonNull ItemTouchHelper itemTouchHelper) {
enableDragItem(itemTouchHelper, NO_TOGGLE_VIEW, true);
}
/**
* 禁用拖动item功能
*/
public void disableDragItem() {
itemDragEnabled = false;
mItemTouchHelper = null;
}
/**
* 开启拖动item的子view的功能
* 长按时使用传入的 toggleViewId 作为toggleView。
*
* @param itemTouchHelper {@link ItemTouchHelper}
* @param toggleViewId 被拖动的itemView的子view的id
* @param dragOnLongPress 如果为true,则拖动事件将在长按时触发,否则将在点击时触发。
*/
public void enableDragItem(@NonNull ItemTouchHelper itemTouchHelper, int toggleViewId, boolean dragOnLongPress) {
itemDragEnabled = true;
mItemTouchHelper = itemTouchHelper;
setToggleViewId(toggleViewId);
setToggleDragOnLongPress(dragOnLongPress);
}
/**
* 设置长按子View:mToggleViewId触发拖动事件
* 如果未设置mToggleViewId,则在长按item时触发拖动事件
*/
public void setToggleViewId(int toggleViewId) {
mToggleViewId = toggleViewId;
}
public boolean isItemDraggable() {
return itemDragEnabled;
}
/**
* 如果为true,则拖动事件将在长按时触发,否则将在点击时触发。
*
* @param longPress 默认为true
*/
public void setToggleDragOnLongPress(boolean longPress) {
mDragOnLongPress = longPress;
if (mDragOnLongPress) {