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

news2024/10/7 18:32:19

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


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>

效果图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1509292.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

搭建交换机模拟环境及SSH连接,华为NSP软件入门使用教程

搭建交换机模拟环境及SSH连接&#xff0c;华为NSP软件入门使用教程 如果你是通过搜索搜到了这篇文章&#xff0c;那么一定是工作或者学习中需要用交换机&#xff0c;但是又没物理机测试学习&#xff0c;所以需要搭建本地的虚拟环境学习。 这篇文章是我进行交换机命令入门学习写…

阅读欣赏推荐之(三)——纪录片《地平线系列:大数据时代》

现今的我们正处于一个时代转型中&#xff0c;因为科技的发展与互联网的日益强大&#xff0c;数据将逐步取代旧事物&#xff0c;创造出新事物。当今社会以一种前所未有的方式&#xff0c;通过对海量数据进行分析&#xff0c;获得巨大价值的产品和服务&#xff0c;或深刻的洞见。…

Jmeter+Ant+Git/SVN+Jenkins实现持续集成接口测试,一文精通(二)

前言 上篇内容已经介绍接口测试流程以及了解如何用jmeter接口测试&#xff0c;本篇将介绍如何在实战中应用 一、Jmeter接口关联 1.使用正则表达式实现接口关联&#xff08;可以作用于任意值&#xff09; 如果说一个请求里面有多次请求服务器。 2.使用Jsonpath表达式实现接口关…

【CV论文阅读】【计算机视觉中的Transformer应用综述】(1)

0.论文摘要 摘要——自然语言任务的Transformer model模型的惊人结果引起了视觉社区的兴趣&#xff0c;以研究它们在计算机视觉问题中的应用。在它们的显著优点中&#xff0c;与递归网络例如长短期记忆&#xff08;LSTM&#xff09;相比&#xff0c;Transformer能够模拟输入序…

Cocos2dx-lua ScrollView[二]进阶篇

一.概述 本文缩写说明:sv = ScrollView, item代表ScrollView的一个子节点 如果对sv熟系程度还不够,请阅读基础篇: Cocos2dx-lua ScrollView[一]基础篇-CSDN博客 本文介绍sv的一种封装类库,来实现快速创建sv,有如下几个优点: 1.item的位置通过参数控制,提高开发效率…

【MySQL】1.在Centos 7上如何卸载/安装/配置MySQL(保姆级教程)

MySQL 在 Centos 7环境安装 说明&#xff1a; • 安装与卸载中&#xff0c;用户全部切换成为root&#xff0c;⼀旦安装&#xff0c;普通用户能使用的 • 初期练习&#xff0c;mysql不进行用户管理&#xff0c;全部使用root进行&#xff0c;尽快适应mysql语句&#xff0c;后⾯学…

机器学习,剪刀,石头,布

计算机视觉:剪刀,石头,步 TensorFlow AI人工智能及Machine Learning训练图集的下载建立分类模型并用图像进行训练检验模型总结当前AI Machine Learning 异常火爆,希望在MCU上使用机器学习,做图像识别的工作。看到一个剪刀,石头,步的学习程序,给大家分享一下。 TensorFl…

记录一个vue编辑的移动端页面

<template><div class"wrap"><el-form :model"queryParams" ref"queryForm" size"small" :inline"true" label-width"120px"><el-form-item label"班级" prop"classId"…

K8s — PVC|PV Terminating State

在本文中&#xff0c;我们将讨论PV和PVC一直Terminating的状态。 何时会Terminting? 在以下情况下&#xff0c;资源将处于Terminating状态。 在删除Bounded 状态的PVC之前&#xff0c;删除了对应的PV&#xff0c;PV在删除后是Terminting状态。删除PVC时&#xff0c;仍有引用…

使用飞书机器人发送消息与文件

本文默认你已拥有一个机器人&#xff0c;如果没有请点击以下链接创建机器人 检查机器人权限 如果需要跨部门发送消息&#xff0c;检查是否开通跨部门权限 在发布版本时选择作用范围为所有员工 机器人发送消息需要获取以下权限&#xff1a; 通过手机号或邮箱获取用户 ID查看…

ETL的数据挖掘方式

ETL的基本概念 数据抽取&#xff08;Extraction&#xff09;&#xff1a;从不同源头系统中获取所需数据的步骤。比如从mysql中拿取数据就是一种简单的抽取动作&#xff0c;从API接口拿取数据也是。 数据转换&#xff08;Transformation&#xff09;&#xff1a;清洗、整合和转…

Flutter可重排的列表控件ReorderableListView详解

文章目录 ReorderableListView 介绍主要属性使用示例注意事项 ReorderableListView 介绍 ReorderableListView 是 Flutter 中一个可重排的列表控件&#xff0c;允许用户通过拖动来改变列表项的顺序。它继承自 ListView&#xff0c;并提供了一些额外的功能来实现重排功能。 主…

应用方案 | DCDC电源管理芯片MC34063A

DCDC电源管理芯片 MC34063A MC34063A 为一单片 DC-DC 变换集成电路&#xff0c;内含温度补偿的参考电压源&#xff08;1.25V&#xff09;、比较器、能有效限制电流及控制工作周期的振荡器&#xff0c;驱动器及大电流输出开关管等。外配少量元件&#xff0c;就能组成升压、…

Mysql 学习(十五)redo 日志

redo 日志 什么是redo日志&#xff1f;在说这个之前我们先来想一个场景&#xff0c;在访问磁盘的页面之前&#xff0c;我们会先把页面缓存到Buffer Pool之后&#xff0c;才会访问。写页面的时候也会先将buffer pool中的页面修改之后&#xff0c;然后在某个时机才会刷新到磁盘中…

Centos7 安装mongodb 7.0

官方手册参考&#xff1a; https://www.mongodb.com/docs/manual/tutorial/install-mongodb-on-red-hat/ Mongodb支持的版本 安装 MongoDB 社区版 按照以下步骤使用包管理器安装 MongoDB Community Edition yum。 配置包管理系统 ( yum) 创建一个/etc/yum.repos.d/mongodb-o…

uni-app微信小程序上拉加载,下拉刷新

pages.json配置官网链接 onPullDownRefresh、onReachBottom函数跟生命周期同级 data() {return {orderList:[],total: null, //总共多少条数据page: 1,pageSize: 10,} }, onLoad() {}, mounted(){this.getInfo() }, methods:{getInfo(){API.getListxxx().then(res > {const…

sensitive-word 敏感词 违规文字检测

1、快速开始 - JDK1.7- Maven 3.x 2、Maven 引入 <!-- https://mvnrepository.com/artifact/com.github.houbb/sensitive-word --><dependency><groupId>com.github.houbb</groupId><artifactId>sensitive-word</artifactId><version…

【CSS3】CSS3 3D 转换示例 - 3D 旋转木马 ( @keyframes 规则 定义动画 | 为 盒子模型 应用动画 | 开启透视视图 | 设置 3D 呈现样式 )

文章目录 一、3D 导航栏示例 - 核心要点1、需求分析2、HTML 结构section 标签 3、CSS 样式keyframes 规则 定义动画为 盒子模型 应用动画开启透视视图设置 3D 呈现样式鼠标移动到控件上方效果设置 6 个子盒子模型的效果 二、完整代码示例1、代码示例2、展示效果 一、3D 导航栏示…

安全防御第七次作业

拓扑图如图所示&#xff1a; 问题&#xff1a;在FW7和FW8之间建立一条IPSEC通道保证10.0.2.0/24网段 可以正常访问到192.168.1.0/24 注&#xff1a;基础配置我在此省略了 一、NAT配置 FW4&#xff1a; FW6&#xff1a; 二、在FW4上做服务器映射 三、配置IPSEC FW5&#xff…

最大的单入口空闲区域

最大的单入口空闲区域 问题描述输入输出代码实现 问题描述 找到最大的单入口空闲区域。 空闲区域是由连通的’O’组成的区域&#xff0c;位于边界的’O’可以是入口&#xff0c; 单入口空闲区域即有且只有一个位于边界的’O’作为入口的由连通的’O’组成的区域。 如果两个元素…