当前位置:   article > 正文

Android RecyclerView的 拖拽 拖动位置以及右滑删除包含源码 私信_android recyclerview长按移动拖拽

android recyclerview长按移动拖拽

第一步:

先使用RecyclerView写好一个基本列表

第二步:

定义一个接口 后面进行实现调用

  1. public interface ItemDragTouchHelper {
  2. //交换位置
  3. void onItemMove(RecyclerView.ViewHolder source, RecyclerView.ViewHolder target);
  4. //选中
  5. void onItemSelect(RecyclerView.ViewHolder source);
  6. //恢复状态
  7. void onItemClear(RecyclerView.ViewHolder source);
  8. //右滑删除
  9. void onSwiped(int adapterPosition);
  10. }

第三步:

继承ItemTouchHelper.Callback  实现具体的拖拽功能  每一个都有注释

  1. public class ItemDragTouchHelperCallback2 extends ItemTouchHelper.Callback {
  2. // 调用 使用接口 实现
  3. private ItemDragTouchHelper helper;
  4. public ItemDragTouchHelperCallback2(ItemDragTouchHelper helper) {
  5. this.helper = helper;
  6. }
  7. //获取移动标志
  8. @Override
  9. public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
  10. //拖拽标记 这里允许上下左右四个方向
  11. int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
  12. // | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
  13. //滑动标记 这里允许左右滑动
  14. int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;
  15. return makeMovementFlags(dragFlags, swipeFlags);
  16. }
  17. //当一个Item被另外的Item替代是回调,也就是数据集的内容顺序改变
  18. //recyclerView:有长按拖拽功能的recyclerView
  19. //viewHolder:手指长按后被拖拽的Item
  20. // target:拖拽目标位置的Item
  21. @Override
  22. public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
  23. helper.onItemMove(viewHolder, target);
  24. return false;
  25. }
  26. //当某一个Item 被滑动离开后 回调
  27. @Override
  28. public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
  29. helper.onSwiped(viewHolder.getAdapterPosition());
  30. System.out.println("离开屏幕");
  31. }
  32. //item是否可以长按
  33. @Override
  34. public boolean isLongPressDragEnabled() {
  35. return true;
  36. }
  37. //item 是否可以滑动
  38. @Override
  39. public boolean isItemViewSwipeEnabled() {
  40. return true;
  41. }
  42. //恢复状态
  43. @Override
  44. public void clearView(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
  45. super.clearView(recyclerView, viewHolder);
  46. //recycler是否在计算布局
  47. if (!recyclerView.isComputingLayout()) {
  48. helper.onItemClear(viewHolder);
  49. }
  50. }
  51. //选中的状态
  52. @Override
  53. public void onSelectedChanged(@Nullable RecyclerView.ViewHolder viewHolder, int actionState) {
  54. super.onSelectedChanged(viewHolder, actionState);
  55. //actionState:行为状态, ACTION_STATE_IDLE, ACTION_STATE_SWIPE :滑动行为,ACTION_STATE_DRAG:拖拽行为
  56. if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
  57. helper.onItemSelect(viewHolder);
  58. }
  59. }
  60. }

第四步:

在Activity中实现接口

  1. class ItemTouchHelperNow implements ItemDragTouchHelper {
  2. //拖拽换位置
  3. @Override
  4. public void onItemMove(RecyclerView.ViewHolder source, RecyclerView.ViewHolder target) {
  5. // 移动时更改列表中对应的位置
  6. Collections.swap(list,source.getAdapterPosition(),target.getAdapterPosition());
  7. //更新状态
  8. recyclerView.getAdapter().notifyItemMoved(source.getAdapterPosition(),target.getAdapterPosition());
  9. onItemClear(source);
  10. }
  11. //被选中时候的状态 会被放大
  12. @Override
  13. public void onItemSelect(RecyclerView.ViewHolder source) {
  14. source.itemView.setScaleX(1.1f);
  15. source.itemView.setScaleY(1.1f);
  16. }
  17. //恢复原来的状态
  18. @Override
  19. public void onItemClear(RecyclerView.ViewHolder source) {
  20. source.itemView.setScaleX(1.0f);
  21. source.itemView.setScaleY(1.0f);
  22. }
  23. //右滑删除
  24. @Override
  25. public void onSwiped(int adapterPosition) {
  26. list.remove(adapterPosition);
  27. recyclerView.getAdapter().notifyItemRemoved(adapterPosition);
  28. }
  29. }

第五步:

和RecyclerView绑定

  1. recyclerView = findViewById(R.id.recycler);
  2. recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
  3. recyclerView.setAdapter(new MyAdapter2());
  4. // 适配器添加拖拽回调
  5. ItemDragTouchHelperCallback2 itemDragTouchHelperCallback2 = new ItemDragTouchHelperCallback2(new ItemTouchHelperNow());
  6. ItemTouchHelper itemTouchHelper = new ItemTouchHelper(itemDragTouchHelperCallback2);
  7. // 为recyclerView添加拖拽功能
  8. itemTouchHelper.attachToRecyclerView(recyclerView);

参考

(32条消息) Android随笔-RecyclerView实现拖拽换位功能_android recyclerview拖动_阿pin的博客-CSDN博客

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/286732
推荐阅读
相关标签
  

闽ICP备14008679号