当前位置:   article > 正文

安卓多个listView拖动数据交换位置和拖动

安卓多个listView拖动数据交换位置和拖动

注意这里只是给出大概思路,具体可以参考修改自己想要的

  1. public class MainActivity extends AppCompatActivity {
  2. private ListView listView1;
  3. private ListView listView2;
  4. private ArrayAdapter<String> adapter1;
  5. private ArrayAdapter<String> adapter2;
  6. private int dragIndex = -1;
  7. private boolean isDragged1 = false;
  8. private boolean isDragged2 = false;
  9. @Override
  10. protected void onCreate(Bundle savedInstanceState) {
  11. super.onCreate(savedInstanceState);
  12. setContentView(R.layout.activity_main);
  13. listView1 = findViewById(R.id.listView1);
  14. listView2 = findViewById(R.id.listView2);
  15. adapter1 = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1);
  16. adapter2 = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1);
  17. listView1.setAdapter(adapter1);
  18. listView2.setAdapter(adapter2);
  19. adapter1.add("Item 1");
  20. adapter1.add("Item 2");
  21. adapter1.add("Item 3");
  22. adapter2.add("Item A");
  23. adapter2.add("Item B");
  24. adapter2.add("Item C");
  25. listView1.setOnItemLongClickListener((parent, view, position, id) -> {
  26. isDragged1 = true; // 标记列表1正在拖动
  27. dragIndex = position;
  28. ClipData data = ClipData.newPlainText("", "");
  29. View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
  30. view.startDrag(data, shadowBuilder, view, 0);
  31. return true;
  32. });
  33. listView2.setOnItemLongClickListener((parent, view, position, id) -> {
  34. isDragged2 = true; // 标记列表2正在拖动
  35. dragIndex = position;
  36. ClipData data = ClipData.newPlainText("", "");
  37. View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
  38. view.startDrag(data, shadowBuilder, view, 0);
  39. return true;
  40. });
  41. listView1.setOnDragListener(new MyDragListener());
  42. listView2.setOnDragListener(new MyDragListener());
  43. }
  44. //多个 list拖动
  45. // class MyDragListener implements View.OnDragListener {
  46. // @Override
  47. // public boolean onDrag(View v, DragEvent event) {
  48. // int action = event.getAction();
  49. // switch (action) {
  50. // case DragEvent.ACTION_DROP: // 当拖拽动作完成时
  51. // if (v == listView2 && isDragged1) { // 如果目标是 listView2 且之前有拖拽操作
  52. // String item1 = adapter1.getItem(dragIndex); // 获取拖拽的数据项
  53. // adapter1.remove(item1); // 从原列表移除
  54. // adapter2.add(item1); // 添加到新列表
  55. // adapter1.notifyDataSetChanged(); // 刷新原列表
  56. // adapter2.notifyDataSetChanged(); // 刷新新列表
  57. // } else if (v == listView1 && isDragged2) { // 如果目标是 listView1 且之前有拖拽操作
  58. // String item2 = adapter2.getItem(dragIndex); // 获取拖拽的数据项
  59. // adapter2.remove(item2); // 从原列表移除
  60. // adapter1.add(item2); // 添加到新列表
  61. // adapter1.notifyDataSetChanged(); // 刷新原列表
  62. // adapter2.notifyDataSetChanged(); // 刷新新列表
  63. // }
  64. // isDragged1 = false; // 拖动结束,重置标记
  65. // isDragged2 = false;
  66. // dragIndex = -1;
  67. // break;
  68. // }
  69. // return true;
  70. // }
  71. // }
  72. /**
  73. * 拖动交换位置
  74. */
  75. class MyDragListener implements View.OnDragListener {
  76. @Override
  77. public boolean onDrag(View v, DragEvent event) {
  78. int action = event.getAction();
  79. switch (action) {
  80. case DragEvent.ACTION_DROP: // 当拖拽动作结束时
  81. if (v == listView2 && isDragged1) {
  82. String item1 = adapter1.getItem(dragIndex); // 获取拖拽源列表项数据
  83. int targetPosition = getItemPositionFromPoint(event.getX(), event.getY(), listView2); // 获取目标位置
  84. String item2 = adapter2.getItem(targetPosition); // 获取目标位置处的列表项数据
  85. adapter1.remove(item1); // 从源列表中移除数据
  86. adapter2.remove(item2); // 从目标列表中移除数据
  87. adapter1.insert(item2, dragIndex); // 在源列表中插入数据
  88. adapter2.insert(item1, targetPosition); // 在目标列表中插入数据
  89. adapter1.notifyDataSetChanged(); // 更新源列表
  90. adapter2.notifyDataSetChanged(); // 更新目标列表
  91. } else if (v == listView1 && isDragged2) {
  92. String item2 = adapter2.getItem(dragIndex); // 获取拖拽源列表项数据
  93. int targetPosition = getItemPositionFromPoint(event.getX(), event.getY(), listView1); // 获取目标位置
  94. String item1 = adapter1.getItem(targetPosition); // 获取目标位置处的列表项数据
  95. adapter2.remove(item2); // 从源列表中移除数据
  96. adapter1.remove(item1); // 从目标列表中移除数据
  97. adapter2.insert(item1, dragIndex); // 在源列表中插入数据
  98. adapter1.insert(item2, targetPosition); // 在目标列表中插入数据
  99. adapter2.notifyDataSetChanged(); // 更新源列表
  100. adapter1.notifyDataSetChanged(); // 更新目标列表
  101. }
  102. isDragged1 = false; // 拖动结束,重置标记
  103. isDragged2 = false;
  104. dragIndex = -1;
  105. break;
  106. }
  107. return true;
  108. }
  109. // 根据坐标点获取列表项位置
  110. private int getItemPositionFromPoint(float x, float y, ListView listView) {
  111. int position = listView.pointToPosition((int) x, (int) y); // 根据坐标点获取位置
  112. int firstVisiblePosition = listView.getFirstVisiblePosition(); // 第一个可见项位置
  113. int lastVisiblePosition = listView.getLastVisiblePosition(); // 最后一个可见项位置
  114. if (position >= firstVisiblePosition && position <= lastVisiblePosition) {
  115. View itemView = listView.getChildAt(position - firstVisiblePosition); // 获取对应位置的视图
  116. if (itemView != null) {
  117. int itemTop = itemView.getTop();
  118. int itemBottom = itemView.getBottom();
  119. int itemHeight = itemView.getHeight();
  120. if (y >= itemTop + itemHeight / 2) { // 判断是否在列表项中部
  121. return position;
  122. }
  123. }
  124. }
  125. return position - 1; // 返回最终位置
  126. }
  127. }
  128. }

布局

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:layout_width="match_parent"
  3. android:layout_height="match_parent"
  4. android:orientation="horizontal">
  5. <ListView
  6. android:id="@+id/listView1"
  7. android:layout_width="0dp"
  8. android:layout_height="match_parent"
  9. android:layout_weight="1" />
  10. <ListView
  11. android:id="@+id/listView2"
  12. android:layout_width="0dp"
  13. android:layout_height="match_parent"
  14. android:layout_weight="1" />
  15. </LinearLayout>

效果图

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