赞
踩
先使用RecyclerView写好一个基本列表
定义一个接口 后面进行实现调用
- public interface ItemDragTouchHelper {
-
- //交换位置
- void onItemMove(RecyclerView.ViewHolder source, RecyclerView.ViewHolder target);
-
- //选中
- void onItemSelect(RecyclerView.ViewHolder source);
-
- //恢复状态
- void onItemClear(RecyclerView.ViewHolder source);
-
- //右滑删除
- void onSwiped(int adapterPosition);
-
- }
继承ItemTouchHelper.Callback 实现具体的拖拽功能 每一个都有注释
- public class ItemDragTouchHelperCallback2 extends ItemTouchHelper.Callback {
- // 调用 使用接口 实现
- private ItemDragTouchHelper helper;
-
- public ItemDragTouchHelperCallback2(ItemDragTouchHelper helper) {
- this.helper = helper;
- }
-
- //获取移动标志
- @Override
- public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
- //拖拽标记 这里允许上下左右四个方向
- int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
- // | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
- //滑动标记 这里允许左右滑动
- int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;
- return makeMovementFlags(dragFlags, swipeFlags);
- }
-
- //当一个Item被另外的Item替代是回调,也就是数据集的内容顺序改变
- //recyclerView:有长按拖拽功能的recyclerView
- //viewHolder:手指长按后被拖拽的Item
- // target:拖拽目标位置的Item
- @Override
- public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
- helper.onItemMove(viewHolder, target);
- return false;
- }
-
- //当某一个Item 被滑动离开后 回调
- @Override
- public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
- helper.onSwiped(viewHolder.getAdapterPosition());
- System.out.println("离开屏幕");
- }
-
- //item是否可以长按
- @Override
- public boolean isLongPressDragEnabled() {
- return true;
- }
-
- //item 是否可以滑动
- @Override
- public boolean isItemViewSwipeEnabled() {
- return true;
- }
-
- //恢复状态
- @Override
- public void clearView(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
- super.clearView(recyclerView, viewHolder);
- //recycler是否在计算布局
- if (!recyclerView.isComputingLayout()) {
- helper.onItemClear(viewHolder);
- }
- }
-
- //选中的状态
- @Override
- public void onSelectedChanged(@Nullable RecyclerView.ViewHolder viewHolder, int actionState) {
- super.onSelectedChanged(viewHolder, actionState);
- //actionState:行为状态, ACTION_STATE_IDLE, ACTION_STATE_SWIPE :滑动行为,ACTION_STATE_DRAG:拖拽行为
- if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
- helper.onItemSelect(viewHolder);
- }
- }
- }

在Activity中实现接口
- class ItemTouchHelperNow implements ItemDragTouchHelper {
-
- //拖拽换位置
- @Override
- public void onItemMove(RecyclerView.ViewHolder source, RecyclerView.ViewHolder target) {
- // 移动时更改列表中对应的位置
- Collections.swap(list,source.getAdapterPosition(),target.getAdapterPosition());
- //更新状态
- recyclerView.getAdapter().notifyItemMoved(source.getAdapterPosition(),target.getAdapterPosition());
- onItemClear(source);
- }
-
- //被选中时候的状态 会被放大
- @Override
- public void onItemSelect(RecyclerView.ViewHolder source) {
- source.itemView.setScaleX(1.1f);
- source.itemView.setScaleY(1.1f);
- }
-
- //恢复原来的状态
- @Override
- public void onItemClear(RecyclerView.ViewHolder source) {
- source.itemView.setScaleX(1.0f);
- source.itemView.setScaleY(1.0f);
- }
- //右滑删除
- @Override
- public void onSwiped(int adapterPosition) {
- list.remove(adapterPosition);
- recyclerView.getAdapter().notifyItemRemoved(adapterPosition);
- }
- }

和RecyclerView绑定
- recyclerView = findViewById(R.id.recycler);
- recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
- recyclerView.setAdapter(new MyAdapter2());
- // 适配器添加拖拽回调
- ItemDragTouchHelperCallback2 itemDragTouchHelperCallback2 = new ItemDragTouchHelperCallback2(new ItemTouchHelperNow());
- ItemTouchHelper itemTouchHelper = new ItemTouchHelper(itemDragTouchHelperCallback2);
- // 为recyclerView添加拖拽功能
- itemTouchHelper.attachToRecyclerView(recyclerView);
参考
(32条消息) Android随笔-RecyclerView实现拖拽换位功能_android recyclerview拖动_阿pin的博客-CSDN博客
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。