Android:RecyclerView自由拖动item

原生就自带有可拖动item的工具:ItemTouchHelper

看下效果:

可拖动RecyclerView预览效果

接下来我们看如何使用。

1、自定义ItemTouchHelper的callback,用来限制是否可以拖动,以及拖动之后的位置更新:

其中判断条件中的item.isMovable这边是记录该item是否可以拖动,也可以换成其他判断条件比如根据位置判断等。

private static class MyItemTouchHelperCallback extends ItemTouchHelper.Callback {private final ItemAdapter itemAdapter;public MyItemTouchHelperCallback(ItemAdapter itemAdapter) {this.itemAdapter= itemAdapter;}@Overridepublic int getMovementFlags(@NonNull RecyclerView recyclerView,@NonNull RecyclerView.ViewHolder viewHolder) {int layoutPosition = viewHolder.getLayoutPosition();ItemInfo item = ItemAdapter.getItem(layoutPosition);if (!item.isMovable()) {//不可拖动return makeMovementFlags(0, 0);}//这里表示可以拖动的方向,比如如果不给往上方拖动则去掉ItemTouchHelper.UPfinal int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN| ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;return makeFlag(ItemTouchHelper.ACTION_STATE_DRAG, dragFlags);}@Overridepublic boolean onMove(@NonNull RecyclerView recyclerView,@NonNull RecyclerView.ViewHolder viewHolderSource,@NonNull RecyclerView.ViewHolder viewHolderTarget) {int layoutPosition = viewHolderTarget.getLayoutPosition();ItemInfo item = itemAdapter.getItem(layoutPosition);if (!item.isMovable()) {//不可拖动到这里return false;}itemAdapter.onMove(viewHolderSource.getAdapterPosition(),viewHolderTarget.getAdapterPosition());return true;}@Overridepublic void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int i) {}}

2、在适配器提供获取item信息和移动之后更新数据的方法给到这个callback使用:

    public ItemInfo getItem(int position) {if (position >= 0 && position < mList.size()) {return mList.get(position);}return null;}public void onMove(int sourcePosition, int targetPosition) {ItemInfo item = mList.get(sourcePosition);mList.remove(sourcePosition);mList.add(targetPosition, item);notifyItemMoved(sourcePosition, targetPosition);}

3、使用这个callback类:

    ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new MyItemTouchHelperCallback(adapter));itemTouchHelper.attachToRecyclerView(recyclerView);

就可以了,简简单单,轻轻松松。

另外,需要留意一点,如果你是在onBindViewHolder中有设置点击事件的,在onClickListener里面不要直接使用onBindViewHolder方法传进来的position,因为在item位置移动之后,这个position是不会变的,注册事件监听的时候这个值就跟你的点击事件绑死了,所以需要动态获取这个position:

    holder.view.setOnClickListener(v -> {int currentPosition = holder.getAdapterPosition();ItemInfo info = getItem(currentPosition);if (listener != null) {listener.onItemClick(currentPosition, info);}});

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

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

相关文章

python的__doc__

直接问GPT的回答如下&#xff0c;但是提供的例子不够好。 __doc__ 是 Python 中用于保存对象&#xff08;模块、类、函数等&#xff09;文档字符串的特殊属性。 文档字符串&#xff08;docstring&#xff09;是编写在代码中用于文档自述的字符串。它通常用于提供关于代码目的…

python常见函数-笔记

lambda函数用法 匿名函数lambda&#xff1a;是指一类无需定义标识符&#xff08;函数名&#xff09;的函数或子程序。 所谓匿名函数&#xff0c;通俗地说就是没有名字的函数&#xff0c;lambda函数没有名字&#xff0c;是一种简单的、在同一行中定义函数的方法。 lambda函数一…

锂电池SOC估计 | PatchTST时间序列模型锂电池SOC估计

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 锂电池SOC估计 | PatchTST时间序列模型锂电池SOC估计 采用新型PatchTST时间序列模型预测锂电池SOC&#xff0c;送锂电池数据集 可替换数据集&#xff0c;实现负荷预测、流量预测、降雨量预测、空气质量预测等其他多种…

k8s之ingress

ingress基于域名进行映射&#xff0c;把url(http https)的请求转发到service&#xff0c;再由service把请求转发到每一个pod ingress只要一个或者少量的公网ip或者LB&#xff0c;可以把多个http请求暴露到外网&#xff0c;七层反向代理 理解为service的service&#xff0c;是…

OSPF基础华为ICT网络赛道

6.1.OSPF协议概述 由协议之中OSPF(Open Shortest Path First,开放式最短路径优先)协议是使用场 景非常广泛的动态路由协议之一。 OSPF在RFC2328中定义&#xff0c;是一种基于链路状态算法的路由协议。 静态路由是由工程师手动配置和维护的路由条目&#xff0c;命令行简单明确…

年末怒赚一笔,程序员快码住!趁热接单

元旦已过&#xff0c;龙年将至。 有钱没钱&#xff0c;回家过年。 话说回来&#xff0c;年关将至&#xff0c;农历的2023即将落下帷幕。天气渐寒&#xff0c;你的钱包是否也让你心生寒意&#xff1f;年初立下的赚钱flag是否优雅地实现了? 如果flag都倒了&#xff0c;你先别…

【数据结构】从顺序表到ArrayList类

文章目录 1.线性表1.1线性表的概念2.顺序表2.1顺序表的概念2.2顺序表的实现2.3接口的实现(对数组增删查改操作)3.ArrayList简介4. ArrayList使用 4.1ArrayList的构造4.2 ArrayList的方法4.3 ArrayList的遍历 1.线性表 1.1线性表的概念 线性表&#xff08;linear list&#xf…

postgres面试题

《PostgreSQL面试题集锦》学习与回答_pg面试-CSDN博客 postgresql 数据库面试题及知识梳理_51CTO博客的技术博客_51CTO博客 PostgreSQL问答&#xff08;面试&#xff09;- 2211_51CTO博客的技术博客_51CTO博客 PostgreSQL问答&#xff08;面试&#xff09;- 2210_51CTO博客的…

微信怎么设置自动回复?教程来咯!

自动回复信息 你有没有为了回复微信消息&#xff0c;中断工作进度&#xff0c;耽误了大量时间&#xff1f;或者错过了潜在客户&#xff1f;现在&#xff0c;我们的微信管理系统&#xff0c;可以帮助你在第一时间&#xff0c;实时回复用户消息。 01 # 通过好友自动打招呼# 我们…

CTF CRYPTO 密码学-5

题目名称&#xff1a;山岚 题目描述&#xff1a; 山岚 f5-lf5aa9gc9{-8648cbfb4f979c-c2a851d6e5-c} 解题过程&#xff1a; Step1&#xff1a;根据题目提示栅栏加密 分析 观察给出的密文发现有f、l、a、g等字符有规律的夹杂的密文中间&#xff0c;看出都是每3个字符的第1…

springboot集成tess4j

spring整合tess4j用于OCR识别图片&#xff0c;在windows环境识别正常&#xff0c;在liunx没有反应&#xff0c;本文用于解决部署linux问题。 整合springboot 1、引入pom文件 <dependency><groupId>net.sourceforge.tess4j</groupId><artifactId>tess…

linux文件系统 - 初始化(三)

https://www.cnblogs.com/alantu2018/p/8447309.html 执行init程序 一、目的 内核加载完initrd文件后&#xff0c;为挂载磁盘文件系统做好了必要的准备工作&#xff0c;包括挂载了sysfs、proc文件系统&#xff0c;加载了磁盘驱动程序驱动程序等。接下来&#xff0c;内核跳转…

Kubernetes中拉取Harbor私有镜像

1、首先&#xff0c;确保已经安装了Docker并配置好了与Harbor的连接。可以使用docker login <harbor地址>命令登录到Harbor仓库。 创建一个Secret对象来存储Harbor的认证信息。可以通过运行以下命令生成该Secret对象&#xff1a; kubectl create secret docker-registry…

three.js从入门到精通系列教程002 - three.js正交相机OrthographicCamera

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>three.js从入门到精通系列教程002 - three.js正交相机OrthographicCamera</title><script src"ThreeJS/three.js"></script><script src&qu…

如果查看iPhone的GPU

摘要 了解你的显卡对于在电脑上玩现代图形要求高的游戏非常重要。本文介绍了如何轻松查看你的显卡型号以及为什么显卡在玩电脑游戏时如此关键。 引言 随着电脑游戏的发展&#xff0c;现代游戏对硬件性能的要求越来越高。十年前发布的显卡已经无法满足当前游戏的需求。因此&…

项目管理经验总结

需求优先级管理 需求插入&#xff1a; 如果有紧急需求&#xff0c;或高优先级需求优先其它开发资源&#xff0c;如果现有的人力资源都被占用&#xff0c;可以挂起旧需求、插入新需求。 需求阶段 要点&#xff1a; 确保需求无缺失、无漏洞、无歧义、大小合适。确保开发/测试对需…

什么叫特征分解?

特征分解&#xff08;Eigenvalue Decomposition&#xff09;是将一个方阵分解为特征向量和特征值的过程。对于一个 nn 的方阵A&#xff0c;其特征向量&#xff08;Eigenvector&#xff09;v 和特征值&#xff08;Eigenvalue&#xff09; λ 满足以下关系&#xff1a; 这可以写…

【Linux】:线程池(逐行解析代码)

线程池 一.概念二.模拟实现一个线程池 一.概念 一种线程使用模式。线程过多会带来调度开销&#xff0c;进而影响缓存局部性和整体性能。而线程池维护着多个线程&#xff0c;等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅…

Distributed Transactions at Scale in Amazon DynamoDB——论文泛读

ATC 2023 Paper 论文阅读笔记整理 问题 NoSQL云数据库服务因其简单的键值操作、高可用性、高可扩展性和可预测的性能而广受欢迎。尽管NoSQL数据库很实用&#xff0c;但它们通常不支持事务。 键值存储等NoSQL数据库是关系数据库的一种替代方案&#xff0c;它强调可扩展性和性…

博捷芯划片机在半导体芯片切割领域的领先实力

在当今高速发展的半导体行业中&#xff0c;芯片切割作为制造过程中的核心技术环节&#xff0c;对设备的性能和精度要求日益提升。在这方面&#xff0c;国内知名划片机企业博捷芯凭借其卓越的技术实力和持续的创新精神&#xff0c;成功研发出具备完全自主知识产权的半导体切割划…