安卓多个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;@Overrideprotected 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 {@Overridepublic 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"><ListViewandroid:id="@+id/listView1"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1" /><ListViewandroid:id="@+id/listView2"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1" /></LinearLayout>

效果图

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

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

相关文章

研发效能DevOps: OpenEuler 部署 drone 持续集成平台

目录 一、实验 1.环境 2.OpenEuler 部署 drone 持续集成平台 二、问题 1.drone登录失败 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 系统架构版本IP备注LinuxopenEuler22.03 LTS SP2 192.168.204.145&#xff08;动态&#xff09; 192.168.204.141&…

jenkins容器中安装python遇到问题

在Jenkins容器中安装配置Python时遇到问题 执行./configure --prefix/opt/python3/时遇到configure: error: no acceptable C compiler found in $PATH 这个问题就是缺少gcc编译环境。将gcc安装上即可&#xff1a; yum install -y gcc##前提是容器里的系统是cenos才可以&#…

`sh -c`命令——解决命令权限问题、一条命令中执行多个指令

sh -c在Shell中执行一个字符串作为命令&#xff0c;可以在一条命令中执行多个指令。 目录 语法如下&#xff1a;案例 使用sh -c与直接终端敲命令的区别使用sh -c解决命令权限问题 语法如下&#xff1a; sh -c command其中&#xff0c;command是要执行的命令或命令串。 案例 …

Excel下拉自动填充

1、选中需要下拉填充的单元格&#xff0c;按下Ctrl&#xff0c;然后再往下拖动填充。 下拉结果&#xff1a; 2、选中两个连续的单元格&#xff0c;往下拖动填充&#xff0c;可以填充增加两数差。 下拉结果&#xff1a; 本文为学习笔记&#xff0c;所参考文章均已附上链接&#…

【Node.js从基础到高级运用】六、创建第一个 Node.js 应用

创建第一个 Node.js 应用 在这一节中&#xff0c;我们将引导你创建你的第一个 Node.js 应用——一个简单的 “Hello World” 程序。这将帮助你熟悉 Node.js 项目的基本结构和模块化编程的概念。 步骤 1: 初始化项目 首先&#xff0c;创建一个新的目录作为项目的根目录&#…

设计模式前置了解uml图

在开发前&#xff0c;会进行系统的设计&#xff0c;而数据模型的设计大多通过 UML 类图实现。为了在 UML 类图中清晰地表达类之间的关系&#xff0c;需要对类之间的关系有一定的认识&#xff0c;并且了解相关的表达符号。 类之间的关系有以下几种&#xff1a; 组合 聚合 关联…

个人商城系统开源(配置支付宝支付!)

原文地址&#xff1a;个人商城系统开源&#xff08;配置支付宝支付&#xff01;&#xff09; - Pleasure的博客 下面是正文内容&#xff1a; 前言 由于近期实在没有什么话题可写和一些有趣的项目教程可以分享。所以我只能决定将我自己亲手编写的一个迷你迷你商城系统进行开源…

手机和电脑同步的好用记事本软件有哪些

我常常需要随手记录各种信息&#xff0c;以便随时查阅和使用。比如&#xff0c;在下班路上&#xff0c;我会用手机记录明天要处理的工作事项、购物清单&#xff0c;或是某个突然迸发的创意想法&#xff1b;而在办公室&#xff0c;我则需要在电脑上整理会议纪要、项目计划&#…

java学习(集合)

一.集合(主要是单列集合和双列集合) 1.集合的框架体系&#xff08;两大类&#xff09; 2.collection接口是实现类的特点&#xff1a; 1)collection实现子类可以存放多个元素&#xff0c;每个元素可以是Object 2)有效Collection的实现类&#xff0c;可以存放重复的元素&#…

案例分析篇04:数据库设计相关28个考点(1~8)(2024年软考高级系统架构设计师冲刺知识点总结系列文章)

专栏系列文章推荐: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12601310.html 【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例分析篇-…

基于Llama 2家族的提示词工程:Llama 2 Chat, Code Llama, Llama Guard

Prompt Engineering with Llama 2 本文是学习 https://www.deeplearning.ai/short-courses/prompt-engineering-with-llama-2/ 的学习笔记。 文章目录 Prompt Engineering with Llama 2What you’ll learn in this course [1] Overview of Llama Models[2] Getting Started wi…

华为配置ISP选路实现报文按运营商转发

Web举例&#xff1a;配置ISP选路实现报文按运营商转发 介绍通过配置ISP选路实现报文按运营商转发的配置举例。 组网需求 如图1所示&#xff0c;FW作为安全网关部署在网络出口&#xff0c;企业分别从ISP1和ISP2租用一条链路。 企业希望访问Server 1的报文从ISP1链路转发&#…

大语言模型提示工程简介

提示工程是一个较新的学科&#xff0c;应用于开发和优化提示词&#xff08;Prompt&#xff09;&#xff0c;帮助用户有效地将语言模型用于各种应用场景和研究领域。掌握了提示工程相关技能将有助于用户更好地了解大型语言模型的能力和局限性。研究人员可利用提示工程来提高大语…

卷积神经网络CNN(一篇文章 理解)

目录 一、引言 二、CNN算法概述 1 卷积层 2 池化层 3 全连接层 三、CNN算法原理 1 前向传播 2 反向传播 四、CNN算法应用 1 图像分类 2 目标检测 3 人脸识别 六、CNN的优缺点 优点&#xff1a; 1 特征提取能力强 2 平移不变性 3 参数共享 4 层次化表示 缺点…

生成式 AI:使用 Pytorch 通过 GAN 生成合成数据

导 读 生成对抗网络&#xff08;GAN&#xff09;因其生成图像的能力而变得非常受欢迎&#xff0c;而语言模型&#xff08;例如 ChatGPT&#xff09;在各个领域的使用也越来越多。这些 GAN 模型可以说是人工智能/机器学习目前主流的原因&#xff1b; 因为它向每个人&#xff0…

Windows下IntelliJ IDEA远程连接服务器中Hadoop运行WordCount(详细版)

使用IDEA直接运行Hadoop项目&#xff0c;有两种方式&#xff0c;分别是本地式&#xff1a;本地安装HadoopIDEA&#xff1b;远程式&#xff1a;远程部署Hadoop&#xff0c;本地安装IDEA并连接&#xff0c; 本文介绍第二种。 一、安装配置Hadoop (1)虚拟机伪分布式 见上才艺&a…

机器学习-04-分类算法-01决策树

总结 本系列是机器学习课程的系列课程&#xff0c;主要介绍机器学习中分类算法&#xff0c;本篇为分类算法开篇与决策树部分。 本门课程的目标 完成一个特定行业的算法应用全过程&#xff1a; 懂业务会选择合适的算法数据处理算法训练算法调优算法融合 算法评估持续调优工程…

酷开科技发力研发酷开系统,让家庭娱乐生活更加丰富多彩

在这个快节奏的社会&#xff0c;家庭娱乐已成为我们日常生活中不可或缺的一部分&#xff0c;为了给家庭带来更多欢笑与感动&#xff0c;酷开科技发力研发出拥有丰富内容和技术的智能电视操作系统——酷开系统&#xff0c;它集合了电影、电视剧、综艺、游戏、音乐等海量内容&…

Python 导入Excel三维坐标数据 生成三维曲面地形图(面) 4-3、线条平滑曲面(原始颜色)去除无效点

环境和包: 环境 python:python-3.12.0-amd64包: matplotlib 3.8.2 pandas 2.1.4 openpyxl 3.1.2 scipy 1.12.0 代码: import pandas as pd import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from scipy.interpolate import griddata fr…

Ubuntu 14.04:安装PaddlePaddle(Conda安装)

目录 一、PaddlePaddle 概要 二、PaddlePaddle安装要求 三、PaddlePaddle安装 3.1 安装 Anaconda3 3.2 创建Anaconda虚拟环境&#xff08;python 3.8&#xff09; 3.3 进入Anaconda虚拟环境 3.4 检测 Anaconda 虚拟环境配置是否符合PaddlePaddle安装要求 3.4.1 确认 py…