1、CustomItemTouchCallback自定义、继承ItemTouchHelper.Callback:
package com.zc.shortvideo.helper.utils;
import android.graphics.Canvas;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.RecyclerView;
/**
* author : jian11058
* time : 2022/3/22
* desc :
*/
public class CustomItemTouchCallback extends ItemTouchHelper.Callback {
private final ItemTouchAdapter itemTouchAdapter;
public CustomItemTouchCallback(ItemTouchAdapter itemTouchAdapter) {
this.itemTouchAdapter = itemTouchAdapter;
}
@Override
public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
if (recyclerView.getLayoutManager() instanceof GridLayoutManager) {
final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
final int swipeFlags = 0;
return makeMovementFlags(dragFlags, swipeFlags);
} else {
final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
//final int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;
final int swipeFlags = 0;
return makeMovementFlags(dragFlags, swipeFlags);
}
}
@Override
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder viewHolder1) {
int fromPosition = viewHolder.getAdapterPosition();//得到拖动ViewHolder的position
int toPosition = viewHolder1.getAdapterPosition();//得到目标ViewHolder的position
itemTouchAdapter.onMove(fromPosition, toPosition);
return true;
}
@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
// 从数据源中移除相应的数据
itemTouchAdapter.onSwiped(viewHolder.getAdapterPosition());
}
@Override
public void onChildDraw(@NonNull Canvas c, @NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
}
public interface ItemTouchAdapter {
void onMove(int fromPosition, int toPosition);
void onSwiped(int position);
}
}
2、basequickAdapter的接口实现
package com.zc.shortvideo.helper.adapter;
import android.text.TextUtils;
import android.view.View;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.zc.shortvideo.helper.R;
import com.zc.shortvideo.helper.model.EditModel;
import com.zc.shortvideo.helper.utils.CustomItemTouchCallback;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* author : jian11058
* time : 2022/3/22
* desc :
*/
public class TextAdapter extends BaseQuickAdapter<EditModel, BaseViewHolder> implements CustomItemTouchCallback.ItemTouchAdapter {
private boolean isEdit;
private boolean isShowSelect;//是否显示选中,
public TextAdapter(@Nullable List<EditModel> data,boolean isShowSelect) {
super(R.layout.item_text, data);
this.isShowSelect=isShowSelect;
}
@Override
protected void convert(@NonNull BaseViewHolder helper, EditModel item) {
TextView tv = helper.getView(R.id.item_text_tv);
RelativeLayout layout = helper.getView(R.id.item_text_layout);
ImageView img_delete = helper.getView(R.id.item_text_img_remove);
if (!TextUtils.isEmpty(item.title)) {
tv.setText(item.title);
}
if (isShowSelect){
tv.setSelected(item.isVip);
}
if (isEdit) {
img_delete.setVisibility(View.VISIBLE);
} else {
img_delete.setVisibility(View.GONE);
}
}
@Override
public void onMove(int fromPosition, int toPosition) {
// if (fromPosition == 0 || toPosition == 0) {
// return;
// }
// if (fromPosition == 1 || toPosition == 1) {
// return;
// }
if (fromPosition < toPosition) {
for (int i = fromPosition; i < toPosition; i++) {
Collections.swap(getData(), i, i + 1);
}
} else {
for (int i = fromPosition; i > toPosition; i--) {
Collections.swap(getData(), i, i - 1);
}
}
notifyItemMoved(fromPosition, toPosition);
}
@Override
public void onSwiped(int position) {
getData().remove(position);
notifyItemRemoved(position);
}
/**
* 显示删除按钮
*
* @param isShow
*/
public void showEditMode(boolean isShow) {
isEdit = isShow;
notifyDataSetChanged();
}
public void setSelectPosition(int position){
for (int i = 0; i < getData().size(); i++) {
EditModel editModel = getData().get(i);
if (position!=i){
if (editModel.isVip){
editModel.isVip=false;
notifyItemChanged(i);
}
}else {
editModel.isVip=true;
notifyItemChanged(i);
}
}
}
public List<String> getTitles(){
List<String> list=new ArrayList<>();
if (getData().size()==0){
return list;
}
for (EditModel datum : getData()) {
list.add(datum.title);
}
return list;
}
}
3、使用
recyclerView_mine.setLayoutManager(new GridLayoutManager(mContext,4));
recyclerView_mine.setAdapter(adapter_mine);
adapter_mine.setSelectPosition(position);
ItemTouchHelper itemTouchHelper=new ItemTouchHelper(new CustomItemTouchCallback(adapter_mine));
itemTouchHelper.attachToRecyclerView(recyclerView_mine);