RecyclerView更全解析之 - 仿支付宝侧滑删除和拖动排序
2017-01-06 16:30
525 查看
1.概述
这是春节前的最后一篇分享技术的博客了,接下来的时间需要去完善视频讲解,至于今年都干了哪些事有什么成就吹牛的这里就不多说了,声明一下图片资源我是盗用的别人的。这是最后一期分享RecyclerView了,我们直接看这一期需要分享的效果:视频讲解:http://pan.baidu.com/s/1jIlwl4E
相关文章:
RecyclerView更全解析之 - 基本使用和分割线解析
RecyclerView更全解析之 - 打造通用的万能Adapter
RecyclerView更全解析之 - 为它优雅的添加头部和底部
RecyclerView更全解析之 - 打造通用的下拉刷新上拉加载
RecyclerView更全解析之 - 仿支付宝侧滑删除和拖动排序
2.基本思路
前面我们一直都是围着RecyclerView在转,发现这个控件让我们是又爱又恨,通过这几期的分享或者说是封装应该已经让我们喜欢上它了,那么今天我们在来看一个如此神奇的功能。我记得当初在做ListView的拖动排序的时候在网上找了各种资料,代码量还真不是一丁点,现在我们来看一下RecyclerView的拖动排序和侧滑删除需要怎么去实现,告诉你只需要简简单单的几行代码。实现这么个功能我们不需要再去继承RecyclerView,只需要去了解ItemTouchHelper这个类即可,接下来我们就去看看都有些什么。
3.基本实现
3.1 实现侧滑删除ItemTouchHelper这是google给我们写好的,专门用来处理Touch相关的一个类,我们先来实现一个简单的功能侧滑删除,先上代码再解释:
// 实现左边侧滑删除 ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.Callback() { @Override public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { // 获取触摸响应的方向 包含两个 1.拖动dragFlags 2.侧滑删除swipeFlags // 代表只能是向左侧滑删除,当前可以是这样ItemTouchHelper.LEFT|ItemTouchHelper.RIGHT int swipeFlags = ItemTouchHelper.LEFT; // 拖动暂不处理默认是0 return makeMovementFlags(0, swipeFlags); } @Override public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { return false; } @Override public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { } }); // 这个就不多解释了,就这么attach itemTouchHelper.attachToRecyclerView(mRecyclerView);
ItemTouchHelper.Callback 默认需要实现三个方法:
getMovementFlags() 获取Touch的响应方向,包含两个 1.拖动dragFlags 2.侧滑删除swipeFlags,都可以是上下左右,上面事例没有处理拖动所以传的是0,侧滑给的是ItemTouchHelper.LEFT,所以待会效果是向左滑动删除;
onMove() 拖动的时候会不断的回调这个方法,拖动的时候肯定需要不断的更新列表数据,达到一边拖动列表不断更新当前数据;
onSwiped() 侧滑删除之后的回调方法。
目前的效果可以侧滑删除但是发现列表不更新,而且侧滑的时候不高亮,当然如果你不想要高亮那就不处理,再来改改:
// 实现左边侧滑删除 ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.Callback() { @Override public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { // 获取触摸响应的方向 包含两个 1.拖动dragFlags 2.侧滑删除swipeFlags // 代表只能是向左侧滑删除,当前可以是这样ItemTouchHelper.LEFT|ItemTouchHelper.RIGHT int swipeFlags = ItemTouchHelper.LEFT; // 拖动暂不处理默认是0 return makeMovementFlags(0, swipeFlags); } @Override public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { return false; } /** * 侧滑删除后会回调的方法 */ @Override public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { // 获取当前删除的位置 int position = viewHolder.getAdapterPosition(); mItems.remove(position); // adapter 更新notify当前位置删除 mAdapter.notifyDataSetChanged(); } /** * 拖动选择状态改变回调 */ @Override public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) { if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) { // ItemTouchHelper.ACTION_STATE_IDLE 看看源码解释就能理解了 // 侧滑或者拖动的时候背景设置为灰色 viewHolder.itemView.setBackgroundColor(Color.GRAY); } } /** * 回到正常状态的时候回调 */ @Override public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { // 正常默认状态下背景恢复默认 viewHolder.itemView.setBackgroundColor(0); } }); // 这个就不多解释了,就这么attach itemTouchHelper.attachToRecyclerView(mRecyclerView);
3.2 实现拖动排序
上面有两个方法onSelectedChanged(),clearView()不做过多的介绍,接下来实现拖动排序,还是我们在上面的代码基础山做一下修改,需要修改两个方法:
getMovementFlags() 的dragFlags参数不能传0了,侧滑的时候没处理现在需要处理一下了;
onMove() 在拖动的时候不断的回调改变列表的位置,不光要改变位置还要不断的改变数据集合的列表。
// 实现左边侧滑删除 和 拖动排序 ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.Callback() { @Override public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { // 获取触摸响应的方向 包含两个 1.拖动dragFlags 2.侧滑删除swipeFlags // 代表只能是向左侧滑删除,当前可以是这样ItemTouchHelper.LEFT|ItemTouchHelper.RIGHT int swipeFlags = ItemTouchHelper.LEFT; // 拖动 int dragFlags = 0; if (recyclerView.getLayoutManager() instanceof GridLayoutManager) { // GridView 样式四个方向都可以 dragFlags = ItemTouchHelper.UP | ItemTouchHelper.LEFT | ItemTouchHelper.DOWN | ItemTouchHelper.RIGHT; } else { // ListView 样式不支持左右,只支持上下 dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN; } return makeMovementFlags(dragFlags, swipeFlags); } /** * 拖动的时候不断的回调方法 */ @Override public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { // 获取原来的位置 int fromPosition = viewHolder.getAdapterPosition(); // 得到目标的位置 int targetPosition = target.getAdapterPosition(); if (fromPosition > targetPosition) { for (int i = fromPosition; i < targetPosition; i++) { Collections.swap(mItems, i, i + 1);// 改变实际的数据集 } } else { for (int i = fromPosition; i > targetPosition; i--) { Collections.swap(mItems, i, i - 1);// 改变实际的数据集 } } mAdapter.notifyItemMoved(fromPosition, targetPosition); return true; } /** * 侧滑删除后会回调的方法 */ @Override public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { // 获取当前删除的位置 int position = viewHolder.getAdapterPosition(); mItems.remove(position); // adapter 更新notify当前位置删除 mAdapter.notifyItemRemoved(position); } /** * 拖动选择状态改变回调 */ @Override public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) { if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) { // ItemTouchHelper.ACTION_STATE_IDLE 看看源码解释就能理解了 // 侧滑或者拖动的时候背景设置为灰色 viewHolder.itemView.setBackgroundColor(Color.GRAY); } } /** * 回到正常状态的时候回调 */ @Override public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { // 正常默认状态下背景恢复默认 viewHolder.itemView.setBackgroundColor(0); ViewCompat.setTranslationX(viewHolder.itemView,0); } }); // 这个就不多解释了,就这么attach itemTouchHelper.attachToRecyclerView(mRecyclerView);
附视频地址:http://pan.baidu.com/s/1jIlwl4E
相关文章推荐
- RecyclerView更全解析之 - 仿支付宝侧滑删除和拖动排序
- RecylerView全简析之仿支付宝侧滑删除和拖动排序
- 【Android开源项目解析】RecyclerView侧滑删除粒子效果实现——初探Android开源粒子库 Leonids
- 使用RecylerView完成拖动排序高仿qq侧滑删除功能
- android的RecyclerView实现拖拽排序和侧滑删除示例
- 使用RecylerView完成拖动排序,仿qq侧滑删除
- RecyclerView实现拖动排序和滑动删除功能
- RecyclerView滑动删除和拖动排序
- Android基础——RecyclerView拖拽排序侧滑删除
- ItemTouchHelper实现RecyclerView拖动排序和滑动删除
- 【Android开源项目解析】RecyclerView侧滑删除粒子效果实现——初探Android开源粒子库 Leonids
- Android开发学习之路-RecyclerView滑动删除和拖动排序
- RecyclerView 下拉刷新 加载更多 左滑删除 拖动排序
- RecyclerView的侧滑删除和长按拖动2--动画的添加
- Android recyclerview实现拖拽排序和侧滑删除
- Android基础控件——RecyclerView实现拖拽排序侧滑删除效果
- RecyclerView的侧滑删除和长按拖动
- RecyclerView上下拖动条目排序,左右划出屏幕删除条目的最简单的实现
- android viewpager指示器管理,拖动排序,添加删除动画
- ItemTouchHleper实现RecyclerView侧滑删除