RecyclerView更全解析之 - 仿支付宝侧滑删除和拖动排序

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相关的一个类,我们先来实现一个简单的功能侧滑删除,先上代码再解释:

1 // 实现左边侧滑删除 2 ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.Callback() { 3 @Override 4 public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { 5 // 获取触摸响应的方向 包含两个 1.拖动dragFlags 2.侧滑删除swipeFlags 6 // 代表只能是向左侧滑删除,当前可以是这样ItemTouchHelper.LEFT|ItemTouchHelper.RIGHT 7 int swipeFlags = ItemTouchHelper.LEFT; 8 9 // 拖动暂不处理默认是0 10 return makeMovementFlags(0, swipeFlags); 11 } 12 13 @Override 14 public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { 15 return false; 16 } 17 18 @Override 19 public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { 20 21 } 22 }); 23 // 这个就不多解释了,就这么attach 24 itemTouchHelper.attachToRecyclerView(mRecyclerView);

ItemTouchHelper.Callback 默认需要实现三个方法:

  • getMovementFlags() 获取Touch的响应方向,包含两个 1.拖动dragFlags 2.侧滑删除swipeFlags,都可以是上下左右,上面事例没有处理拖动所以传的是0,侧滑给的是ItemTouchHelper.LEFT,所以待会效果是向左滑动删除;

  • onMove() 拖动的时候会不断的回调这个方法,拖动的时候肯定需要不断的更新列表数据,达到一边拖动列表不断更新当前数据;

  • onSwiped() 侧滑删除之后的回调方法。

这里写图片描述

目前的效果可以侧滑删除但是发现列表不更新,而且侧滑的时候不高亮,当然如果你不想要高亮那就不处理,再来改改:

1 // 实现左边侧滑删除 2 ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.Callback() { 3 @Override 4 public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { 5 // 获取触摸响应的方向 包含两个 1.拖动dragFlags 2.侧滑删除swipeFlags 6 // 代表只能是向左侧滑删除,当前可以是这样ItemTouchHelper.LEFT|ItemTouchHelper.RIGHT 7 int swipeFlags = ItemTouchHelper.LEFT; 8 9 // 拖动暂不处理默认是0 10 return makeMovementFlags(0, swipeFlags); 11 } 12 13 @Override 14 public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { 15 return false; 16 } 17 18 /** 19 * 侧滑删除后会回调的方法 20 */ 21 @Override 22 public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { 23 // 获取当前删除的位置 24 int position = viewHolder.getAdapterPosition(); 25 mItems.remove(position); 26 // adapter 更新notify当前位置删除 27 mAdapter.notifyDataSetChanged(); 28 } 29 30 /** 31 * 拖动选择状态改变回调 32 */ 33 @Override 34 public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) { 35 if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) { 36 // ItemTouchHelper.ACTION_STATE_IDLE 看看源码解释就能理解了 37 // 侧滑或者拖动的时候背景设置为灰色 38 viewHolder.itemView.setBackgroundColor(Color.GRAY); 39 } 40 } 41 42 /** 43 * 回到正常状态的时候回调 44 */ 45 @Override 46 public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { 47 // 正常默认状态下背景恢复默认 48 viewHolder.itemView.setBackgroundColor(0); 49 } 50 }); 51 // 这个就不多解释了,就这么attach 52 itemTouchHelper.attachToRecyclerView(mRecyclerView);

这里写图片描述

3.2 实现拖动排序
  上面有两个方法onSelectedChanged(),clearView()不做过多的介绍,接下来实现拖动排序,还是我们在上面的代码基础山做一下修改,需要修改两个方法:
  getMovementFlags() 的dragFlags参数不能传0了,侧滑的时候没处理现在需要处理一下了;
  onMove() 在拖动的时候不断的回调改变列表的位置,不光要改变位置还要不断的改变数据集合的列表。

1 // 实现左边侧滑删除 和 拖动排序 2 ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.Callback() { 3 @Override 4 public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { 5 // 获取触摸响应的方向 包含两个 1.拖动dragFlags 2.侧滑删除swipeFlags 6 // 代表只能是向左侧滑删除,当前可以是这样ItemTouchHelper.LEFT|ItemTouchHelper.RIGHT 7 int swipeFlags = ItemTouchHelper.LEFT; 8 9 10 // 拖动 11 int dragFlags = 0; 12 if (recyclerView.getLayoutManager() instanceof GridLayoutManager) { 13 // GridView 样式四个方向都可以 14 dragFlags = ItemTouchHelper.UP | ItemTouchHelper.LEFT | 15 ItemTouchHelper.DOWN | ItemTouchHelper.RIGHT; 16 } else { 17 // ListView 样式不支持左右,只支持上下 18 dragFlags = ItemTouchHelper.UP | 19 ItemTouchHelper.DOWN; 20 } 21 22 return makeMovementFlags(dragFlags, swipeFlags); 23 } 24 25 /** 26 * 拖动的时候不断的回调方法 27 */ 28 @Override 29 public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { 30 // 获取原来的位置 31 int fromPosition = viewHolder.getAdapterPosition(); 32 // 得到目标的位置 33 int targetPosition = target.getAdapterPosition(); 34 if (fromPosition > targetPosition) { 35 for (int i = fromPosition; i < targetPosition; i++) { 36 Collections.swap(mItems, i, i + 1);// 改变实际的数据集 37 } 38 } else { 39 for (int i = fromPosition; i > targetPosition; i--) { 40 Collections.swap(mItems, i, i - 1);// 改变实际的数据集 41 } 42 } 43 mAdapter.notifyItemMoved(fromPosition, targetPosition); 44 return true; 45 } 46 47 /** 48 * 侧滑删除后会回调的方法 49 */ 50 @Override 51 public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { 52 // 获取当前删除的位置 53 int position = viewHolder.getAdapterPosition(); 54 mItems.remove(position); 55 // adapter 更新notify当前位置删除 56 mAdapter.notifyItemRemoved(position); 57 } 58 59 /** 60 * 拖动选择状态改变回调 61 */ 62 @Override 63 public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) { 64 if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) { 65 // ItemTouchHelper.ACTION_STATE_IDLE 看看源码解释就能理解了 66 // 侧滑或者拖动的时候背景设置为灰色 67 viewHolder.itemView.setBackgroundColor(Color.GRAY); 68 } 69 } 70 71 /** 72 * 回到正常状态的时候回调 73 */ 74 @Override 75 public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { 76 // 正常默认状态下背景恢复默认 77 viewHolder.itemView.setBackgroundColor(0); 78 ViewCompat.setTranslationX(viewHolder.itemView,0); 79 } 80 }); 81 // 这个就不多解释了,就这么attach 82 itemTouchHelper.attachToRecyclerView(mRecyclerView);

这里写图片描述

  
附视频地址:http://pan.baidu.com/s/1jHW1X10

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

RecyclerView更全解析之 - 为它优雅的添加头部和底部

1.概述上一期的,解决了几个坑。那么这一期我们来动态为RecyclerView去加载头部和底部,为上一期的RecyclerView列表数据添加广告轮播图,至于广告轮播大家可以看一下这一期,这里我就不多讲了,直接拿过来用。    视频讲解:相关文章: