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

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


public class MainActivity extends AppCompatActivity {

    private ListView listView1;
    private ListView listView2;
    private ArrayAdapter<String> adapter1;
    private ArrayAdapter<String> adapter2;
    private int dragIndex = -1;
    private boolean isDragged1 = false;
    private boolean isDragged2 = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        listView1 = findViewById(R.id.listView1);
        listView2 = findViewById(R.id.listView2);

        adapter1 = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1);
        adapter2 = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1);

        listView1.setAdapter(adapter1);
        listView2.setAdapter(adapter2);

        adapter1.add("Item 1");
        adapter1.add("Item 2");
        adapter1.add("Item 3");

        adapter2.add("Item A");
        adapter2.add("Item B");
        adapter2.add("Item C");


        listView1.setOnItemLongClickListener((parent, view, position, id) -> {
            isDragged1 = true; // 标记列表1正在拖动
            dragIndex = position;
            ClipData data = ClipData.newPlainText("", "");
            View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
            view.startDrag(data, shadowBuilder, view, 0);
            return true;
        });

        listView2.setOnItemLongClickListener((parent, view, position, id) -> {
            isDragged2 = true; // 标记列表2正在拖动
            dragIndex = position;
            ClipData data = ClipData.newPlainText("", "");
            View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
            view.startDrag(data, shadowBuilder, view, 0);
            return true;
        });

        listView1.setOnDragListener(new MyDragListener());
        listView2.setOnDragListener(new MyDragListener());
    }




//多个 list拖动
    //    class MyDragListener implements View.OnDragListener {
//        @Override
//        public boolean onDrag(View v, DragEvent event) {
//            int action = event.getAction();
//            switch (action) {
//                case DragEvent.ACTION_DROP: // 当拖拽动作完成时
//                    if (v == listView2 && isDragged1) { // 如果目标是 listView2 且之前有拖拽操作
//                        String item1 = adapter1.getItem(dragIndex); // 获取拖拽的数据项
//                        adapter1.remove(item1); // 从原列表移除
//                        adapter2.add(item1); // 添加到新列表
//                        adapter1.notifyDataSetChanged(); // 刷新原列表
//                        adapter2.notifyDataSetChanged(); // 刷新新列表
//                    } else if (v == listView1 && isDragged2) { // 如果目标是 listView1 且之前有拖拽操作
//                        String item2 = adapter2.getItem(dragIndex); // 获取拖拽的数据项
//                        adapter2.remove(item2); // 从原列表移除
//                        adapter1.add(item2); // 添加到新列表
//                        adapter1.notifyDataSetChanged(); // 刷新原列表
//                        adapter2.notifyDataSetChanged(); // 刷新新列表
//                    }
//                    isDragged1 = false; // 拖动结束,重置标记
//                    isDragged2 = false;
//                    dragIndex = -1;
//                    break;
//            }
//            return true;
//        }
//    }


    /**
     * 拖动交换位置
     */
    class MyDragListener implements View.OnDragListener {
        @Override
        public boolean onDrag(View v, DragEvent event) {
            int action = event.getAction();
            switch (action) {
                case DragEvent.ACTION_DROP: // 当拖拽动作结束时
                    if (v == listView2 && isDragged1) {
                        String item1 = adapter1.getItem(dragIndex); // 获取拖拽源列表项数据
                        int targetPosition = getItemPositionFromPoint(event.getX(), event.getY(), listView2); // 获取目标位置
                        String item2 = adapter2.getItem(targetPosition); // 获取目标位置处的列表项数据
                        adapter1.remove(item1); // 从源列表中移除数据
                        adapter2.remove(item2); // 从目标列表中移除数据
                        adapter1.insert(item2, dragIndex); // 在源列表中插入数据
                        adapter2.insert(item1, targetPosition); // 在目标列表中插入数据
                        adapter1.notifyDataSetChanged(); // 更新源列表
                        adapter2.notifyDataSetChanged(); // 更新目标列表
                    } else if (v == listView1 && isDragged2) {
                        String item2 = adapter2.getItem(dragIndex); // 获取拖拽源列表项数据
                        int targetPosition = getItemPositionFromPoint(event.getX(), event.getY(), listView1); // 获取目标位置
                        String item1 = adapter1.getItem(targetPosition); // 获取目标位置处的列表项数据
                        adapter2.remove(item2); // 从源列表中移除数据
                        adapter1.remove(item1); // 从目标列表中移除数据
                        adapter2.insert(item1, dragIndex); // 在源列表中插入数据
                        adapter1.insert(item2, targetPosition); // 在目标列表中插入数据
                        adapter2.notifyDataSetChanged(); // 更新源列表
                        adapter1.notifyDataSetChanged(); // 更新目标列表
                    }
                    isDragged1 = false; // 拖动结束,重置标记
                    isDragged2 = false;
                    dragIndex = -1;
                    break;
            }
            return true;
        }

        // 根据坐标点获取列表项位置
        private int getItemPositionFromPoint(float x, float y, ListView listView) {
            int position = listView.pointToPosition((int) x, (int) y); // 根据坐标点获取位置
            int firstVisiblePosition = listView.getFirstVisiblePosition(); // 第一个可见项位置
            int lastVisiblePosition = listView.getLastVisiblePosition(); // 最后一个可见项位置
            if (position >= firstVisiblePosition && position <= lastVisiblePosition) {
                View itemView = listView.getChildAt(position - firstVisiblePosition); // 获取对应位置的视图
                if (itemView != null) {
                    int itemTop = itemView.getTop();
                    int itemBottom = itemView.getBottom();
                    int itemHeight = itemView.getHeight();
                    if (y >= itemTop + itemHeight / 2) { // 判断是否在列表项中部
                        return position;
                    }
                }
            }
            return position - 1; // 返回最终位置
        }
    }
}

布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">

    <ListView
        android:id="@+id/listView1"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1" />

    <ListView
        android:id="@+id/listView2"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1" />

</LinearLayout>

效果图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

来之梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值