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


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

    1. public class MainActivity extends AppCompatActivity {
    2. private ListView listView1;
    3. private ListView listView2;
    4. private ArrayAdapter adapter1;
    5. private ArrayAdapter 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>

    效果图

  • 相关阅读:
    VR全景平台应该具备哪些功能,怎样选择VR全景平台
    智慧机场解决方案-最新全套文件
    WPF之RadioButton单选框和checkbox多选框
    重仓比特币
    锅炉智能制造工厂工业物联数字孪生平台,推进制造业数字化转型
    介绍一款最受欢迎的.NET 开源UI库
    码神之路项目部署(五)
    UnitTest框架
    基于flv.js的视频自动播放
    CentOS 7 无界面版本设置静态IP步骤
  • 原文地址:https://blog.csdn.net/qq_41733851/article/details/136622140