Pich Blog

关注移动开发,大数据,云计算,软件架构!

14.在RecyclerView上实现滑动删除条目

详解RecyclerView系列文章目录

概述

在列表中需要滑动删除,拖拽排序一个条目这种需求是很常见的。那本节就来实现这么一个功能。实现完成的效果如下图。这这里我们使用ItemTouchHelper,这是v7提供的一个帮助类,可以帮助我们更方便的实现滑动删除,拖拽排序等功能。效果如下:

滑动删除

创建ItemTouchHelper

要实现滑动删除很简单,单首先要实现一个RecyclerView的列表,然后在这样的代码基础上修改。

先创建一个ItemTouchHelper,然后给他设置一个回调。在调用attachToRecyclerView附加到REcyclerView上。

实现Callback

可以看到上面我们传入了MyCallback,这是我们自定义的一个回调类,他继承ItemTouchHelper.Callback,我们需要实现如下三个方法,可以发现光看名字都很好理解:

getMovementFlags:获取移动的参数,也就说你的告诉他是否开启滑动,什么方向上可以滑动

onMove:当拖拽的时候调用该方法

onSwiped:当滑动的时候调用该方法

那我们要实现向右滑动删除一个条目,该怎么实现呢?

首先我们想到的是要禁用拖拽,然后只开启向右滑动,那么可以这么实现:

第一个参数是拖拽的配置,传入0等于禁用,第二个就是滑动方向了,可以用|同时开启两个方向。

然后我们只需要在onSwiped方法中删除刚刚移除的条目:

这是我们就可以实现向右滑动删除了。

手动开启滑动

上面实现的例子是在Item的任意位置就可以滑动,但我如果我们想通过按住右边一个按钮,然后才开启滑动呢。那我们就需要禁用默认的滑动,只需要isItemViewSwipeEnabled返回fasle。

这样就禁用了默认的滑动,接下来就需要手动开启滑动,只需要在onBindViewHolder中设置触摸事件:

然后在activity中调用itemTouchHelper的startSwipe方法。

这样就可以开启手动滑动了。

拖拽排序

在一个列表里面我经常需要拖拽排序。那这样的功能在RecyclerView实现也是很简单的。当然还是要借助ItemTouchHelper。

在getMovementFlags方法中开始拖拽。

这里开启了向上,向下都可以拖拽。然后在onMove交换实际的数据,如果不在这里交换真实的数据,那么虽然效果上交换了,但是真实的数据是有问题的。

默认情况下长按一个条目开进入拖拽模式。当前你可以关闭这个功能。

但是这样操作后就没法自动计入拖拽模式了,只能手动开启了,比如我们要实现按住左边的图标启用拖动模式。

手动开启拖拽

我们在onBindViewHolder中给图标控件设置Touch事件:

然后在里面调用ItemTouchHelper的startDrag方法。

现在就实现了按住前面的图片才能拖拽。

删除和拖拽改变背景颜色

如果我们想在删除的Item时,改变背景颜色,这样就有突出的效果,那这怎么实现呢?现在我们实现拖拽和移动显示为不同的颜色。

其实也非常简单,只需要在onSelectedChanged方法中处理,该方法不管是移动,拖拽都会调用,最后还需要在clearView中清除前面的背景。

删除和拖拽动画

上面我只实现了更改背景,但是如果像删除这种操作,如果被删除的Item有个缩放和渐变的效果是不是更好呢。

那说白了我们就是要监听滑动的位置,根据位置和view宽度计算透明度和缩放。那可以在onChildDraw方法中实现。

如何更改滑动范围,滑动速度

请关注RecyclerView源码分析系列文章。

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注