Android Item拖动顺序
2020-08-11 本文已影响0人
我家猫猫不睡觉
-
项目需要做拖动改变支付顺序的功能,使用RecyclerView实现
-
继承ItemTouchHelper.Callback
public class MyItemTouchHelperCallback extends ItemTouchHelper.Callback {
/**
* Callback回调监听时先调用的,用来判断当前是什么动作,比如判断方向
* 作用:哪个方向的拖动
*/
@Override
public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
//方向:up,down,left,right
//常量
// ItemTouchHelper.UP 0x0001
// ItemTouchHelper.DOWN 0x0010
// ItemTouchHelper.LEFT
// ItemTouchHelper.RIGHT
int dragFlags = 0;
if (recyclerView.getLayoutManager() instanceof GridLayoutManager) {
dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN |
ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
} else {
dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
}
// 支持左右滑动(删除)操作, swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END
final int swipeFlags = 0;
int flags = makeMovementFlags(dragFlags, swipeFlags);
return flags;
}
/**
* 是否打开长按拖拽效果
*/
@Override
public boolean isLongPressDragEnabled() {
return true;
}
//当上下移动的时候回调的方法
@Override
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
//被按下拖拽时候的position
int fromPosition = viewHolder.getAdapterPosition();
//当前拖拽到的item的posiiton
int toPosition = target.getAdapterPosition();
//回调到adapter 当中处理移动过程中,数据变更的逻辑,以及更新UI
if (recyclerView.getAdapter() instanceof ItemTouchMoveListener) {
ItemTouchMoveListener listener = ((ItemTouchMoveListener) recyclerView.getAdapter());
listener.onItemMove(fromPosition, toPosition);
}
return true;
}
//侧滑的时候回调的方法
@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
}
//设置滑动item的背景
@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
//判断选中状态
if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
if (viewHolder instanceof OnItemDragListener) {
OnItemDragListener itemViewHolder = (OnItemDragListener) viewHolder;
itemViewHolder.onItemSelected(viewHolder.getAdapterPosition());
}
}
super.onSelectedChanged(viewHolder, actionState);
}
//清除滑动item的背景
@Override
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
// 恢复
if (viewHolder instanceof OnItemDragListener) {
OnItemDragListener itemViewHolder = (OnItemDragListener) viewHolder;
itemViewHolder.onItemFinish(viewHolder.getAdapterPosition());
}
super.clearView(recyclerView, viewHolder);
}
}
- Adapter
public class PayManageAdapter extends RecyclerView.Adapter<PayManageAdapter.IndexViewHolder>
implements ItemTouchMoveListener {
private Context mContext;
private List<TestBean> mList = new ArrayList<>();
private int mFromPosition;
private int mToPosition;
public PayManageAdapter(Context context) {
this.mContext = context;
}
public void setData(List<TestBean> list) {
if (this.mList.size() > 0) {
this.mList.clear();
}
mList.addAll(list);
notifyDataSetChanged();
}
private TouchMovedCallBack mTouchMovedCallBack;
public void setTouchMovedCallBack(TouchMovedCallBack touchMovedCallBack) {
this.mTouchMovedCallBack = touchMovedCallBack;
}
@NonNull
@Override
public IndexViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_pay_sort, parent, false);
return new IndexViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull IndexViewHolder holder, int position) {
TestBean bean = mList.get(position);
//业务逻辑
}
@Override
public int getItemCount() {
return mList == null ? 0 : mList.size();
}
@Override
public boolean onItemMove(int fromPosition, int toPosition) {
//1.数据交换 2.刷新
TestBean bean = mList.get(fromPosition);
mList.remove(fromPosition);
mList.add(toPosition, bean);
notifyItemMoved(fromPosition, toPosition);
return true;
}
class IndexViewHolder extends RecyclerView.ViewHolder implements OnItemDragListener {
private TextView textView;
public IndexViewHolder(@NonNull View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.tv_title);
}
@Override
public void onItemSelected(int fromPosition) {
mFromPosition = fromPosition;
itemView.setBackgroundColor(mContext.getResources().getColor(R.color.color_65AAFC));
}
@Override
public void onItemFinish(int toPosition) {
mToPosition = toPosition;
itemView.setBackgroundColor(mContext.getResources().getColor(R.color.colorWhile));
//传递选中position 和 放下时的position
mTouchMovedCallBack.callBackNewItems(mFromPosition, mToPosition, mList);
}
}
}
// 接口
public interface ItemTouchMoveListener {
/**
* 当拖拽的时候回调
* 可以在方法里面实现:拖拽条目并实现刷新效果
* @param fromPosition 从什么位置拖
* @param toPosition 到什么位置
* @return 是否执行了move
*/
boolean onItemMove(int fromPosition,int toPosition);
}
/**
* ViewHolder 被选中 以及 拖拽释放 触发监听器
*/
public interface OnItemDragListener {
/**
* Item被选中时触发
*/
void onItemSelected(int fromPosition);
/**
* Item在拖拽结束/滑动结束后触发
*/
void onItemFinish(int toPosition);
}
/**
* 顺序移动后返回新的集合及position 用于判断集合是否移动过
*/
public interface TouchMovedCallBack {
void callBackNewItems(int fromPosition, int toPosition,List<TestBean> list);
}
*activity中使用, 实现TouchMovedCallBack接口
mRecyclerView = findViewById(R.id.recycle_view);
LinearLayoutManager manager = new LinearLayoutManager(this);
mRecyclerView.setLayoutManager(manager);
mAdapter = new PayManageAdapter(this);
//条目触摸帮助类
ItemTouchHelper.Callback callback = new MyItemTouchHelperCallback();
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(callback);
itemTouchHelper.attachToRecyclerView(mRecyclerView);
mRecyclerView.setAdapter(mAdapter);
mAdapter.setData(items);
/**
* 移动结束 回调方法
* @param fromPosition item 移动前位置
* @param toPosition item 移动后位置
* @param list
*/
@Override
public void callBackNewItems(int fromPosition, int toPosition, List<TestBean> list) {
LogUtil.e("TestActivity", "fromPosition:" + fromPosition);
LogUtil.e("TestActivity", "toPosition:" + toPosition);
if (fromPosition != toPosition) {
//业务逻辑
}
}