ListView拖拽交换 item 的实现(QQ 分组管理功能)

双11提前购!买周边/年卡,一键领4重福利! 送200元神券包+10%红包返利+最高10年VIP!还能抽iPhone18Pro!仅限1次,速抢>> 阅读详情

在写这篇文章前,碰巧看到有个哥们也做了这个功能,【Android】可拖拽排序的ListView。而且就在几个小时前发表的,本来想还是算了,我就不写这个功能,不过我大致浏览了他的实现原理跟我的实现原理还是有很大差别,所以还是决定写这样一篇文章,因为我相信大家看文章,更多是想了解其中的原理,而非单纯的为了实现某个功能。只有了解了原理,才能扩展,实现更多的功能。

好了,回到正题,先来看效果图
这里写图片描述

分析原理

1、长按获取所按 Item 的 View,并通过View 生成一个 Drawable;
2、 在 ListView 中根据手势滑动不断的绘制 Drawable;
3、Drawable每到达另一个 Item的位置,就替换这个 item,并设置动画效果;
4、当 Drawable 滑到屏幕的最下方或者最上方,且此 ListView 可以滚动,这 listView 执行滚动。
开篇就讲了,此功能的实现方式不止一种,所以有兴趣了解其他实现原理可以看 [【Android】可拖拽排序的ListView]这篇文章。

分步实现

这里就按照原理来一步一步实现此功能,先来看如何获取 Drawable

通过 View 获取 bitmapDrawable
通过 position 获取 View

/*获取Item的View*/
View mobileView = getViewForPosition(position);

因为我们一般在 ListView 的 adapter 中都会复用 View,所以这里需要做一个 position 的转化

    /**
     * 通过位置获取View
     *
     * @param position
     * @return
     */
    public View getViewForPosition(int position) {
        int itemPosition = position - getFirstVisiblePosition();
        View view = getChildAt(itemPosition);
        return view;
    }

通过 View,获取 Drawable

    /**
     * 创建一个
     * BitmapDrawable
     * @param view
     * @return
     */
    private BitmapDrawable createDrawable(View view) {
        BitmapDrawable bitmapDrawable = null;
        /*获取位置变量*/
        int left = view.getLeft();
        int top = view.getTop();
        int right = left + view.getMeasuredWidth();
        int bottom = top + view.getMeasuredHeight();
        /*首先创建一个Bitmap,这个位图为空位图,里面啥也没有*/
        Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);
        /*创建一个画布,把空位图放入画布中*/
        Canvas canvas = new Canvas(bitmap);
        /*把所选的item的View 绘制到画布上,其实也就是会知道了Bitmap上*/
        view.draw(canvas);
        /*绘制边矩形*/
        Rect rect = new Rect(0,0,bitmap.getWidth(),bitmap.getHeight()) ;
        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG) ;
        paint.setStrokeWidth(12);
        paint.setStyle(Paint.Style.STROKE);
        paint.setColor(0xff1f8c03);
        canvas.drawRect(rect, paint);
        /*把bitmap转化成BitmapDrawable*/
        bitmapDrawable = new BitmapDrawable(getResources(), bitmap);
        /*设置drawable的原始位置*/
        mCellOriginBounds = new Rect(left, top, right, bottom);
        /*初始化drawable的当前位置*/
【QT】QTreeWidget实现拖拽Item QTreeWidget实现拖拽,顶层item拖拽到顶层item时,在当前顶层item前面进行插入,顶层item拖拽到非顶层item上禁止,非顶层item拖拽到顶层item上,当前顶层item添加拖拽的非顶层item,非顶层item拖拽到非顶层item上,当前非顶层item前面插入拖拽的非顶层item。 阅读详情

相关推荐

qml鼠标拖动_Qml 拖拽例子

工程目录路径为drag_drop/listview运行时执行./run.sh文件即可。需要安装最新的Qt 5.2 for Linxu 64版本,注意修改一下run.sh中的Qt安装路径。首先,一般的Listview实现的拖拽不能满足我的一下要求:1. 被拖拽的item不能离开原来的位置,拖拽应该动态产生一个副本随着鼠标移动2. 拖拽过程中需要显示不同的icon我的代码来自于qt example目录...

weixin_33761747的博客 1311

QML中鼠标拖动移动ListView中项的位置

在QML开发中,ListView是我们经常用到的控件,可以用它给用户展示出列表,但是往往都是将项目的显示顺序排好后,直接让ListView显示出来,亦或者是知道要移动到具体的那一位置,然后调整数据在ListView中的顺序来达到要求,现有一种需求,就是用鼠标拖动某项,动态去改变某一项在ListView中显示的顺序位置,经过研究及实践实战,实现方式的核心代码如下: import QtQuick 2

Shado_walker的专栏 4081

Qt Quick 中的 ListView 在实际开发中被广泛使用,其中涉及到的拖拽选中换行、添加、删除、移动等操作是非常常见的。今天我将为大家分享如何实现这些操...

在上述代码中,我们定义了一个拖拽区域,并使用 drag.target 属性指定拖拽目标。我们还使用了 drag.axis 属性来限制只能在 X 轴上进行拖拽操作,并使用 drag.minimumX 和 drag.maximumX 属性限制了拖拽范围。Qt Quick 中的 ListView 在实际开发中被广泛使用,其中涉及到的拖拽选中换行、添加、删除、移动等操作是非常常见的。接着,我们可以添加一些动画效果,让 ListView 在拖拽、添加、删除、移动时更具生动性。

. 720

qml-TreeView拖拽-移动item到其他item

在Qml中实现TreeView移动Item到其他Item的Demo实现 文章参考https://www.jianshu.com/p/8d7eeabfbd83

Qt控件QListWidget实现鼠标拖拽Item换序

windows平台下的Qt界面开发中,使列表控件中的项目可以通过鼠标拖拽,改变列表中Item项目的排序,资源通过网络上的教程资源整合,不得商用。

Unity FPS射击控制系统:数据驱动的武器行为解耦方案

在Unity第一人称射击(FPS)开发中,射击系统常因输入、状态、行为耦合导致连发异常、换弹冲突与网络同步失准。其本质是缺乏对‘武器行为’(如后坐力曲线、弹药逻辑)与‘射击控制’(如输入合法性校验、冷却调度)的正交分离。本方案基于ScriptableObject实现WeaponData数据资产化,配合ShootingController状态机服务,达成输入解耦、运行时参数可调、协程受控、网络预测友好等工程目标。适用于中大型FPS项目架构升级与数据驱动转型,尤其解决Unity InputSystem与物理反馈

weixin_30536861的博客 603

vllm运行过程中出现cuda out of memory

将长序列分解为多个小块,每个块分别处理。这样可以减少单次 Prefill 的计算量和显存占用,从而优化 TTFT 和显存使用效率。考虑使用 CPU 卸载(如 --cpu-offload-gb),将部分缓存卸载到 CPU 内存中,扩展 GPU 的虚拟内存。在大语言模型中,当输入序列很长(例如超过 1024 个 Token)时,Prefill 阶段的计算量会非常大。最后增加了enable-chunked-prefill参数和max_num_batched_tokens解决了问题。参数来进一步优化性能。

盛世芳华 3511

MAX30102心率血样模块在STM32F103芯片的程序说明

我希望你已经安装好了Keil MDK5这个软件,也安装了M3内核,可以编译一些STM32F103的一些项目下载程序后步骤: 1-按照下图找到IIC.uvprojx并打开(途中唯一绿色那个图标) 2-编译一次 3-确保0错误,0警告,下图所示 4-点击目标选项,然后找到STM32F103C8,再点debug–CMSIS****(我实际用的JTAG,用不了,选择这个CMSIS****即可)下图所示 5-下图所示,看看你的串口找到了没,找到了就点左下角的OK 6-按图上传到开发板 7-MAX30102接线方法

weixin_51357422的博客 5796

超详细 | 贝叶斯网络基础——有图有真相

Hello,大家好,我是starz。这是本系列的第二篇《概率基础Ⅱ》,虽说是概率基础,但作为过渡,它开始以图为载体 这节的主要内容有: 贝叶斯网络 三种结构 D-划分 贝叶斯球 马尔科夫毯 应用例子 总结 让我们开始吧 :3 贝叶斯网络 概率图模型可笼统分为两类,一是基于无向图的马尔科夫网络: 二是基于有向图的贝叶斯...

qq_41603411的博客 2万+

Python经常遇到导入xlwings就出错,如何解决

Python经常在导入xlwings时遇到错误。有人建议尝试重装或升级xlwings,但这些操作后仍然无法解决导入错误问题。

felix_8的博客 1733

python轮胎缺陷检测_基于深度学习的轮胎缺陷无损检测与分类技术研究

基于深度学习的轮胎缺陷无损检测与分类技术研究【摘要】:随着汽车行业快速发展及汽车保有量的持续增长,大大增加了对轮胎的需求,而轮胎质量在很大程度上决定了轮胎的使用寿命,也是在行驶过程中对人们生命财产安全的保障,同时对轮胎进行在线质量检测也便于轮胎生产企业及时发现生产线中存在的不合格产品,以此来调整机械设备甚至轮胎的生产工艺,避免造成生产材料的浪费。因此,检测轮胎质量是轮胎生产过程中必不可缺少的一部分...

weixin_39689428的博客 1417

x2-DFD:A framework for explainable and explainable deepfake detection

该文章提出了X2-DFD框架,用于可解释和可扩展的深度伪造检测。通过评估大型多模态语言模型(MLLMs)在深度伪造检测中的内在能力,发现它们在不同伪造相关特征上的有效性各异。基于此,实施了针对性的微调策略,显著提高了MLLMs的解释能力,并整合了外部深度伪造检测器(EDDs),以结合MLLMs和传统检测器的互补优势,实现更好的检测和解释。

志在山顶的人,不会贪念山腰的风景 505

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

上一篇: 滑动结束 Activity(二)阴影效果和动画的实现
下一篇: Activity 切换动画(小米图库列表进入详情页,图片从固定位置放大进入,缩小退出)
钟xxa
博客等级 码龄15年 500粉丝 46原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值