安卓多个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才可以&#…

Excel下拉自动填充

1、选中需要下拉填充的单元格&#xff0c;按下Ctrl&#xff0c;然后再往下拖动填充。 下拉结果&#xff1a; 2、选中两个连续的单元格&#xff0c;往下拖动填充&#xff0c;可以填充增加两数差。 下拉结果&#xff1a; 本文为学习笔记&#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链路转发&#…

卷积神经网络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…

Python中的异常处理及最佳实践【第125篇—异常处理】

Python中的异常处理及最佳实践 异常处理是编写健壮、可靠和易于调试的Python代码中不可或缺的一部分。在本文中&#xff0c;我们将深入探讨Python中的异常处理机制&#xff0c;并分享一些最佳实践和代码示例&#xff0c;以帮助您更好地处理错误情况和提高代码的稳定性。 异常…

山姆・阿尔特曼重返OpenAI董事会;Car-GPT:LLMs能否最终实现自动驾驶?

&#x1f989; AI新闻 &#x1f680; 山姆・阿尔特曼重返OpenAI董事会 摘要&#xff1a;经历长达数月的审查后&#xff0c;山姆・阿尔特曼已重返OpenAI董事会&#xff0c;并作为返回条件之一&#xff0c;OpenAI还新增了三名外部女性董事会成员。这标志着公司正努力摆脱去年11…

电子价签前景璀璨,汉朔科技革新零售行业的数字化新篇章

新型商超模式数字化“秘密武器”——电子价签 传统纸质价签&#xff0c;只要商品价格、日期等信息发生变化&#xff0c;就必须重新打印进行手动替换。电子价签的应用使传统的人工申请、调价、打印、营业员去货架前端更换等变价流程均可省略&#xff0c;所有门店的价格由后台统…