使用ItemTouchHelper轻松实现RecyclerView拖拽排序和滑动删除

本文主要是介绍使用ItemTouchHelper轻松实现RecyclerView拖拽排序和滑动删除,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文由liaoinstan授权本公众号发布。

liaoinstan的博客地址:

http://blog.csdn.net/liaoinstan


上一篇推送了为RecyclerView添加ItemClickListener的方案,收到了非常多的留言,很多都给出了对该方案的看法与见解,非常感谢大家的支持,不过虽然推送了该方案,并不是为了让大家都去使用该方案,更多的是为了学习文章中包含的知识点哈。


今天推送的这篇文章仍然和RecyclerView有关,我还记得在RecyclerView还没出现之前,对于ListView或者GridView我们有时候有拖拽排序的需求,或者滑动删除的需求,可能需要我们去编写大量的代码去实现。


如果我说使用RecyclerView只要二三十行自己编写的代码就能实现拖拽排序还滑动删除,你会不会兴奋呢?下文即将揭晓。为了保证大家的体验,我在原文中增加了部分内容和部分效果图。





首先看一眼效果图:

1效果图   

是不是感觉还不错~


2如何实现   

那么是如何实现的呢?主要就要使用到ItemTouchHelper ,ItemTouchHelper 一个帮助开发人员处理拖拽和滑动删除的实现类,它能够让你非常容易实现侧滑删除、拖拽的功能。


实现的代码非常简单我们只需要两步:


  1. 实例化一个ItemTouchHelper

  2. 关联到RecyclerView




恩,就是这么简单。


构造方法中需要一个ItemTouchHelper.Callback,ItemTouchHelper会在拖拽的时候回调Callback中相应的方法,我们只需在Callback中实现自己的逻辑就可以了。


自定义一个类继承实现ItemTouchHelper.Callback接口,需要实现以下方法:



getMovementFlags用于设置是否处理拖拽事件和滑动事件,以及拖拽和滑动操作的方向,有以下两种情况:


  1. 如果是列表类型的RecyclerView,拖拽只有UP、DOWN两个方向

  2. 如果是网格类型的则有UP、DOWN、LEFT、RIGHT四个方向


该方法需要编写的代码如下:




dragFlags 是拖拽标志,swipeFlags是滑动标志,我们把swipeFlags 都设置为0,暂时不考虑滑动相关操作。


如果我们设置了相关的dragFlags ,那么当我们长按item的时候就会进入拖拽并在拖拽过程中不断回调onMove()方法,我们就在这个方法里获取当前拖拽的item和已经被拖拽到所处位置的item的ViewHolder,有了这2个ViewHolder,我们就可以交换他们的数据集并调用Adapter的notifyItemMoved方法来刷新item。




这里的mDatas其实就是Adapter对应的数据集,我们在改变Item位置的同时当然不能忘了数据集需要同步的改变。


到这里,已经可以拖拽了,基本的效果如下:



是不是很神奇,这么复杂的特效,竟然写了几行代码就搞定了~


但是拖拽的时候我们拖拽的对象不能高亮显示,这是不友好的,我们希望拖拽的Item在拖拽的过程中背景颜色加深,这样就需要继续重写下面两个方法:




我们在开始拖拽的时候给item添加一个背景色,然后在拖拽完成的时候还原:




OK,这样就完成了Item的拖拽排序,简单看下现在的效果:



3更加复杂的需求 上面的代码完成了基本功能,但实际的产品需要往往可能会有些不一样,比如说,产品希望,有一些item可以拖拽,一些item无法拖拽,就如上图的“更多”是无法拖拽的。这个咋办呢?


其实在上面我们实现的Callback类中有一个方法我们没有重写:




这个方法是为了告诉ItemTouchHelper是否需要RecyclerView支持长按拖拽,默认返回是ture(即支持),理所当然我们要支持,所以我们没有重写,因为默认true。但是这样做是默认全部的item都可以拖拽,怎么实现部分item拖拽呢,查阅isLongPressDragEnabled方法的源码发现,上面的注释上写着:


Default value returns true but you may want to disable this if you want to 

start dragging on a custom view touch using 

{@link #startDrag(ViewHolder)}.


意思是如果你想自定义触摸view,那么就使用startDrag(ViewHolder)方法。


原来如此,我们可以在item的长按事件中得到当前item的ViewHolder ,然后调用ItemTouchHelper.startDrag(ViewHolder vh)就可以实现拖拽了,那就这么办:


首先我们重写isLongPressDragEnabled返回false,我们要自己调用拖拽过程:




接着我们给RecyclerView添加item长按事件,判断item是否是最后一个(最后一个是“更多”),不是则开始拖拽。


但是,我们都知道RecyclerView并没有提供OnItemLongClickListener,这个问题我们已经在上一篇推送的文章中给出了解决方案,就是使用OnItemTouchListener,然后识别触摸手势,这里给上传送门:RecyclerView添加ItemClickListener的方案,我就直接使用上一篇的成果,不重复讲了(这里你可以使用直接的OnItemClickListener的方案):




OK,大功告成。


4额外的功能    

(1)保存位置


关闭页面以后再打开,又恢复到了初始化的位置,所以就需要保存调整的位置到本地,下次初始化的时候读取位置。 


保存位置应该由开发者自己实现,因为每个人本地化数据的方式都不一样,我这里做一个简单的实现,使用了开源的ACache类,两个方法,搞定:




在clearView方法(拖拽完成)中调用存储方法,在页面初始化数据是调用读取方法,具体代码文后会给出下载链接。


(2)开始拖拽时震动


支付宝的拖拽网格在长按后开始拖拽时会有一次短时间的震动提示用户开始拖拽了,很友好的交互,我们也加一个:


添加权限:


<uses-permission android:name="android.permission.VIBRATE" />


在开始拖拽时添加下面代码:




5滑动删除   

我看到接口里面还有个onSwipe方法,没有使用,没错,这个可用于滑动删除。


仅仅需要几行代码实现滑动删除:



恩,就这样就行了?


还不行,还有标志位没设置




我们针对非表格式的布局设置了swipeFlags为STRAT和END,那么LinearLayoutManager肯定是支持的,看下效果




源码下载地址:

http://download.csdn.net/detail/liaoinstan/9494601

这篇关于使用ItemTouchHelper轻松实现RecyclerView拖拽排序和滑动删除的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/190095

相关文章

闲置电脑也能活出第二春?鲁大师AiNAS让你动动手指就能轻松部署

对于大多数人而言,在这个“数据爆炸”的时代或多或少都遇到过存储告急的情况,这使得“存储焦虑”不再是个别现象,而将会是随着软件的不断臃肿而越来越普遍的情况。从不少手机厂商都开始将存储上限提升至1TB可以见得,我们似乎正处在互联网信息飞速增长的阶段,对于存储的需求也将会不断扩大。对于苹果用户而言,这一问题愈发严峻,毕竟512GB和1TB版本的iPhone可不是人人都消费得起的,因此成熟的外置存储方案开

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

电脑桌面文件删除了怎么找回来?别急,快速恢复攻略在此

在日常使用电脑的过程中,我们经常会遇到这样的情况:一不小心,桌面上的某个重要文件被删除了。这时,大多数人可能会感到惊慌失措,不知所措。 其实,不必过于担心,因为有很多方法可以帮助我们找回被删除的桌面文件。下面,就让我们一起来了解一下这些恢复桌面文件的方法吧。 一、使用撤销操作 如果我们刚刚删除了桌面上的文件,并且还没有进行其他操作,那么可以尝试使用撤销操作来恢复文件。在键盘上同时按下“C

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象