android长按上下拖拽排序、点击删除符号删除
直接用就好
添加依赖app下的build.gradle
implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.4'//最新版万能适配器
最大工程下的settings.gradle依赖图片
maven { url 'https://jitpack.io' }
1、工具MyItemTouchHelper类
public class MyItemTouchHelper extends ItemTouchHelper.Callback {
private List<IncomeEntity> list;
private IncomeAdapter recycleViewAdapter;
private RequestDouble<Integer, Integer> mRequestResult;
private int longClickPosition = -1;
MainActivity activity;
public MyItemTouchHelper(MainActivity activity, List<IncomeEntity> list, IncomeAdapter recycleViewAdapter, RequestDouble<Integer, Integer> requestResult) {
Log.d("dddd", "into MyItemTouchHelper");
this.list = list;
this.recycleViewAdapter = recycleViewAdapter;
this.activity = activity;
this.mRequestResult = requestResult;
}
//设置拖拽和item滑动的可支持方向
@Override
public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
//这里是设置列表水平拖动
// final int dragFlags = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT; //ItemTouchHelper.UP | ItemTouchHelper.DOWN |
//这里是设置列表是垂直拖动
final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN; //ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT |
//这里是设置网格布局拖动
// final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
final int swipeFlags = 0;
return makeMovementFlags(dragFlags, swipeFlags);
}
/**
* 拖拽结束后(手指抬起)会回调的方法
*
* @param recyclerView
* @param viewHolder 手指拖拽的item
* @param target 移动到的item
* @return
*/
@Override
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
// 我们在该方法中实现item数据在数据集合中的位置交换,并调用Adapter的notifyItemMoved完成item界面刷新
recyclerView.getParent().requestDisallowInterceptTouchEvent(true);
//得到当拖拽的viewHolder的Position
int fromPosition = viewHolder.getAdapterPosition();
//拿到当前拖拽到的item的viewHolder
int toPosition = target.getAdapterPosition();
if (fromPosition < toPosition) {
for (int i = fromPosition; i < toPosition; i++) {
//这里暂时注释,用外面的数据来进行交换
// Collections.swap(list, i, i + 1);
}
} else {
for (int i = fromPosition; i > toPosition; i--) {
//这里暂时注释,用外面的数据来进行交换
// Collections.swap(list, i, i - 1);
}
}
int movementFlags = getMovementFlags(recyclerView, viewHolder);
Log.d("dddd=============", " movementFlags = " + movementFlags);
//通知适配器改变位置
recycleViewAdapter.notifyItemMoved(fromPosition, toPosition);
Log.d("dddd=============", " fromPosition = " + fromPosition + " toPosition" + toPosition);
return true;
}
/**
* 侧滑回调
*
* @param viewHolder
* @param direction 方向
*/
@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
}
/**
* 长按选中Item时修改颜色
*
* @param viewHolder
* @param actionState
*/
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
//if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
//viewHolder.itemView.setBackground(getDrawable(R.drawable.card_drag_selected));
//}
if (viewHolder != null) {
longClickPosition = viewHolder.getAdapterPosition();
Log.d("adapterPosition=====", "adapterPosition22222=" + longClickPosition);
}
super.onSelectedChanged(viewHolder, actionState);
}
/**
* 手指松开的时候还原颜色
*
* @param recyclerView
* @param viewHolder
*/
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
int adapterPosition = viewHolder.getAdapterPosition();
if (mRequestResult != null) {
//longClickPosition:这是初始索引值 adapterPosition:这是结束索引值
mRequestResult.result(longClickPosition, adapterPosition);
}
Log.d("adapterPosition=====", "adapterPosition=" + adapterPosition);
super.clearView(recyclerView, viewHolder);
//viewHolder.itemView.setBackground(getDrawable(R.drawable.card));
}
/**
* 重写拖拽不可用
*
* @return
*/
@Override
public boolean isLongPressDragEnabled() {
//开启长按后开始拖拽的效果
return true;
}
public interface RequestDouble<Integer1, Integer2> {
void result(Integer1 integer1, Integer2 integer2);
}
}
2、entity. IncomeEntity类
class IncomeEntity {
var urlImage = ""
var incomeText = ""
}
3、adapter类IncomeAdapter
public class IncomeAdapter extends BaseQuickAdapter<IncomeEntity, BaseViewHolder> {
private OnItemClickListener onItemClickListener;//事件回调监听
public IncomeAdapter(@Nullable List<IncomeEntity> data) {
super(R.layout.income_item, data);
}
@Override
protected void convert(@NonNull BaseViewHolder helper, IncomeEntity item) {
int itemPosition = getItemPosition(item);
helper.setText(R.id.tv_income_title, item.getIncomeText());
//删除
helper.getView(R.id.iv_delete).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getData().remove(itemPosition);
notifyDataSetChanged();
}
});
//变换位置
helper.getView(R.id.iv_income_sort).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onItemClickListener.onItemClick(v, itemPosition);
}
});
}
public interface OnItemClickListener {
void onItemClick(View view, int position);
}
public void setOnItemClickListener(OnItemClickListener listener) {
this.onItemClickListener = listener;
}
}
4、fragment或者activity
private var incomeAdapter: IncomeAdapter? = null
private val infoList: ArrayList<IncomeEntity> = ArrayList()
var mItemTouchHelper: ItemTouchHelper? = null
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
//添加数据
for (i in 0..29) {
var incomeEntity = IncomeEntity()
incomeEntity.incomeText = "收入" + i
infoList.add(incomeEntity)
}
var linearLayoutManager = LinearLayoutManager(activity)
rv_income.layoutManager = linearLayoutManager
//线
var dividerItemDecoration = DividerItemDecoration(context, DividerItemDecoration.VERTICAL)
rv_income.addItemDecoration(dividerItemDecoration)
incomeAdapter = IncomeAdapter(infoList)
rv_income.adapter = incomeAdapter
//适配器点击
incomeAdapter!!.setOnItemClickListener { view, position ->
//添加拖拽事件 longClickPosition:初始索引值 ActionUpPosition:结束索引值
mItemTouchHelper = ItemTouchHelper(MyItemTouchHelper(MainActivity(),
infoList,
incomeAdapter,
label@ RequestDouble { longClickPosition: Int, ActionUpPosition: Int? ->
if (longClickPosition == -1)
//用swap方法可以交换集合中任意两个元素的位置
// Collections.swap(infoList, longClickPosition, ActionUpPosition!!)
//列表的适配器
incomeAdapter!!.notifyDataSetChanged()
}))
//在这里给列表添加移动顺序
mItemTouchHelper?.attachToRecyclerView(rv_income)
}
}
5、adapter对应的xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="56dp">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/iv_delete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:src="@drawable/income_delete_item"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/iv_income"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="9dp"
android:src="@drawable/qq"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@+id/iv_delete"
app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_income_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="17dp"
android:text="工资"
android:textColor="@color/black"
android:textSize="13sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@+id/iv_income"
app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/iv_income_sort"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="17dp"
android:src="@drawable/income_sort_item"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
6、fragment或者activity类
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_income"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="58dp" />
</androidx.constraintlayout.widget.ConstraintLayout>
来吧展示