RecyclerView实现条目Item拖拽排序与滑动删除
来源:互联网 发布:ndcg java 编辑:程序博客网 时间:2024/05/14 15:40
转载地址:http://blog.csdn.net/yanzhenjie1003/article/details/51935982
RecyclerView实现条目Item拖拽排序与滑动删除
版权声明:转载请注明本文转自严振杰的博客: http://blog.csdn.net/yanzhenjie1003
欢迎使用我的另一个更强大的库:RecyclerView侧滑菜单,长按拖拽,滑动删除,下拉刷新上拉加载。
效果演示
直播视频讲解:[http://pan.baidu.com/s/1miEOtwG1
推荐大家结合我直播的视频看效果更好。
本博客源码传送门。
RecyclerView侧滑菜单
RecyclerView滑动删除
RecyclerView长按拖拽
RecyclerView下拉刷新上拉加载,请看下面这篇博客:
http://blog.csdn.net/yanzhenjie1003/article/details/52115566
需求和技术分析
- RecyclerView Item拖拽排序::长按
RecyclerView
的Item或者触摸Item的某个按钮。 - RecyclerView Item滑动删除:RecyclerView Item滑动删除:
RecyclerView
的Item滑动删除。
实现方案与技术
利用ItemTouchHelper绑定RecyclerView
、ItemTouchHelper.Callback
来实现UI更新,并且实现动态控制是否开启拖拽功能和滑动删除功能。
实现步骤
- 继承抽象类
ItemTouchHelper
,并在构造方法传入实现的ItemTouchHelper.Callback
。 - recyclerView绑定ItemTouchHelper:
itemTouchHelper.attachToRecyclerView(recyclerView)
。 - 自定义
ItemTouchHelper.Callback
的实现接口OnItemTouchCallbackListener
,由外部更新RecyclerView
的Item。
几个主要的布局
activity_main.xml
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
这个没啥好说的了吧,就是一个RecyclerView
啦。
接下来是RecyclerView
的Item的布局item.xml:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
这个也不用解释了,到时候下载看源码,就是普通item,展示数据而已。
实现自己的DefaultItemTouchHelper
:继承ItemTouchHelper
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
好嘛,这个太简单了,基本上一行代码都不用写。但是这里需要一个ItemTouchHelp.Callback
啊,所以我们还是要实现一个ItemTouchHelp.Callback
,客观且看下文分解。
实现自己的ItemTouchHelper.Callback
:继承ItemTouchHelper.Callback
这里是全文最重要的部分啦,要认真点看噢,先上代码,后解释,其他看注释和视频。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
好,其实上面最重要的就是五个方法:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
isItemViewSwipeEnabled()
返回值是否可以拖拽排序,true可以,false不可以,isItemViewSwipeEnabled()
是否可以滑动删除,true可以,false不可以;这两个方法都是配置是否可以操作的。我们上面的代码中返回了一个成员变量值,并且这个值通过外部可以修改,所以提供了外部控制的方法。
onMove()
当Item被拖拽排序移动到另一个Item的位置的时候被回调,onSwiped()
当Item被滑动删除到不见;这两个方法是当用户操作了,来回调我们,我们就该去更新UI了。这里我们提供了一个Listener去通知外部,并且返回出去了必要的值,来降低代码耦合度。
getMovementFlags()
说明一:是当用户拖拽或者滑动Item的时候需要我们告诉系统滑动或者拖拽的方向,那我们又知道支持拖拽和滑动删除的无非就是LinearLayoutManager
和GridLayoutManager
了,相当于我们老早的时候用的ListView
和GridView
了。所以我们根据布局管理器的不同做了响应的区分。
getMovementFlags()
说明二:其他都好理解,就是这里的return makeMovementFlags(dragFlag, swipeFlag);
这句话是最终的返回值,也就是它决定了我们的拖拽或者滑动的方法。第一个参数是拖拽flag,第二个是滑动的flag。
重新定义DefaultItemTouchHelper
我们记得上面定义了一个DefaultItemTouchHelper
,它的构造中需要传一个ItemTouchHelper.Callback
,既然我们实现礼了,我们再把DefaultItemTouchHelper
做个封装,使使用者更傻瓜式的调用。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
现在我们看到已经不需要传ItemTouchHelper.Callback
给ItemTouchHelper
了,只需要传我们在DefaultItemTouchHelpCallback
中定义好的OnItemTouchCallbackListener
就好了,而且提供了设置是否可以滑动和是否可以拖拽的方法,而OnItemTouchCallbackListener
只是通知外部滑动了、删除了,你去更新UI吧。
这里可以有的同学会有疑问,上面原来不是继承ItemTouchHelper
吗?这里咋就变成了YolandaItemTouchHelper
了呢?因为我们看到这里多了一句itemTouchHelpCallback = getCallback();
,这个getCallback();
这个方法是没有的,是我们在YolandaItemTouchHelper
中自定义的,因为我们想在DefaultItemTouchHelper
中提供外部设置是否可以拖拽和滑动删除的方法,就得拿到这个Callback
,所以我看了下源码,我们在ItemTouchHelper
构造中把Callback
穿进去,它保存的时候一个package级别的成员变量,所以我在Android.support.v7.widget.helper
包下新建了一个YolandaItemTouchHelper
类:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
如何投入使用
好扯淡也扯完了,封装也封装完了,那么接下来就来在Activity
中使用下咯:
recyclerView绑定ItemTouchHelper
没啥好说的用itemTouchHelper.attachToRecyclerView(recyclerView)
绑定recyclerView
和ItemTouchHelper
,并且只是允许拖拽和滑动删除Item:
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
看到上面还缺少一个onItemTouchCallbackListener
吧,这个也比较重要。
使用Callback
自定义的OnItemTouchCallbackListener
刷新UI
我们在自定义Callback
的时候不是在onMove()
和onSwiped()
方法中回调OnItemTouchCallbackListener
去更新UI吗?这里就是OnItemTouchCallbackListener
如何更新UI的操作了,完成这个操作,那么我们的目的就达到了:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
到这里就结束了,不信你去试试,源码传送门。
- RecyclerView实现条目Item拖拽排序与滑动删除
- RecyclerView实现条目Item拖拽排序与滑动删除
- RecyclerView实现条目Item拖拽排序与滑动删除
- RecyclerView实现条目Item拖拽排序与滑动删除
- RecyclerView实现条目Item拖拽排序与滑动删除
- RecyclerView实现条目Item拖拽排序与滑动删除
- ItemTouchHelper实现RecyclerView条目拖拽移动、滑动删除
- RecyclerView学习--item实现拖拽和滑动删除
- android中用RecyclerView实现滑动删除与切换item
- 利用RecyclerView实现的一个动画给变item的位置和左右滑动删除该RcyclervView的Item条目
- RecyclerView拖拽排序和滑动删除实现
- RecyclerView的条目拖拽和条目滑动
- 使用RecyclerView实现ListView,GridView的效果(上下,左右滑动),拖拽与滑动删除
- RecyclerView实现列表Item长按移动、左右滑动删除
- 使用ItemTouchHelper轻松实现RecyclerView拖拽排序和滑动删除
- 使用ItemTouchHelper轻松实现RecyclerView拖拽排序和滑动删除
- RecyclerView完美实现拖拽,滑动删除,撤销删除
- RecyclerView 滑动删除与拖动的实现
- 深度学习与计算机视觉 讲的太好了
- 迪拜警察机器人上岗 精通6种语言
- 反射机制 java实现
- DeepLearning(基于caffe)实战项目(3)--我们关心的caffe输出
- Junit单体测试
- RecyclerView实现条目Item拖拽排序与滑动删除
- 21.struts2_通过超链接实现国际化转换
- 常用神经网络模型及其应用评述
- 全能的多媒体播放框架Vitamio
- 进制转换
- jqgrid实现客户端导出Excel、txt、word、json等数据格式的文件
- 每天一个 Linux 命令(38):cal 命令
- 『ORACLE』 数据库quiesce模式(11g)
- 代码片1