RecyclerView学习(三)

  • 时间:
  • 浏览:2
  • 来源:大发彩神APP_大发神彩APP官方

亲戚亲戚当当我们都都 都儿在上一步肯能拿到了item的position与itemLayout,在MotionEvent.ACTION_MOVE的事先使用itemLayout就还都还能不能 进行滑动,在MotionEvent.ACTION_UP的事先使用position就还都还能不能 进行删除。

5.RecyclerView的滑动优化

事先说到当滑动的距离小于红块的一半,松开手指事先,会自动收缩当前item,假若这人 滑动比较生硬,用户体验很差。亲戚亲戚当当我们都都 都儿需要实现渐进式滑动,也假若View的弹性滑动。这里亲戚亲戚当当我们都都 都儿使用的是Scroller。

第两个参数是一有另一个匀速插值器

至此,一有另一个漂亮的侧滑删除就肯能实现了,零碎的东西不少,记录下来一起学习~~

评论里有小伙伴说上加点击事件后没有 效果,会产生事件冲突。谢谢这位小伙伴的提醒,事先没有 考虑这方面的哪此的现象。假若周末在家完善了一下,看看为什么我么我处理的吧。

偶尔看到知乎首页的侧滑删除,感觉还不错。事先用RecyclerView的ItemTouchHelper类来实现了Item的拖动和删除功能,今天带来的则是纯手工打造的一有另一个侧滑删除。老规矩,先看看效果图:

源码地址:

当滑动的距离小于红块的一半,松开手指事先,会自动收缩当前item;当滑动的距离超过一半,松开手指事先,会自动将当前item删除。一起看看为什么我么我实现的吧:

viewHolder是存放视图与数据的地方,假若拿到当前item的viewHolder,就还都还能不能 获取到亲戚亲戚当当我们都都 都儿的itemLayout,也假若需要滑动的LinearLayout。RecyclerView提供了一有另一个getChildViewHolder()的方式来获取当前item的viewHolder,传进去的参数假若通过getChildAt(index)获取到的view。

首先向Scroller获取当前的滑动起点,通过scrollTo方式实现滑动,假若再调用invalidate()来进行重绘,又会调用computeScroll()方式,假若再获取当前的起点,使用scrollTo方式滑动到新的位置。没有 往复,直到整个滑动刚现在开始。觉得Scroller的设计思想假若小幅度滑动组成整个的弹性滑动。

移动计算值 = 最刚现在开始点坐标 - 最后移动到的坐标

在Listview当中,有一有另一个pointToPosition(x, y)方式还都还能不能 根据坐标获取到当前的position,在RecyclerView中没有 这人 方式,需要亲戚亲戚当当我们都都 都儿当事人动手写一有另一个。

2.View的滑动实现:

(1)滑动方式:

这里我是使用View两种提供的scrollTo/scrollBy方式来实现滑动,scrollBy实际上也是调用了scrollTo方式,scrollTo实现的是基于所传递参数的绝对滑动,而scrollBy实现的是基于当前位置的相对滑动。

https://github.com/18722527635/MyRecyclerView

初始化Scroller:

(2)滑动方向

在Android屏幕直角坐标系中,原点在屏幕左上角,向右X为正,向下Y为正。

scrollBy()的参数的正负影响滑动的方向,这里亲戚亲戚当当我们都都 都儿只考虑水平方向上的滑动,否则 否则 将第两个参数设置为0。

按亲戚亲戚当当我们都都 都儿正常的理解,应该是参数为负的事先,向坐标轴负方向滑动;当参数为正的事先,向坐标轴正方向滑动。

scrollBy()在参数为负的事先,向坐标轴正方向滑动;当参数为正的事先,向坐标轴负方向滑动。

这是肯能在scrollBy()源码执行过程的最后,会调用这人 方式 :

invalidateInternal(l - scrollX, t - scrollY, r - scrollX, b - scrollY, true, false);

其中l,t,r,b为没有 坐标点,scrollX,scrollY为目标坐标点,只有当目标坐标点值是负数时,负负得正,移动到的位置才为正数,没有 才会重新绘制,整体的View就会向坐标轴正方向滑动。

补充:

RecyclerView的点击事件无非假若接口回调获取position的过程,亲戚亲戚当当我们都都 都儿在MotionEvent.ACTION_DOWN的事先肯能拿到了position。没有 假若在点击的事先将这人 position传递给Activity呢。现在假若判断哪此动作是点击就还都还能不能 了!!!觉得假若对比一下MotionEvent.ACTION_DOWN与MotionEvent.ACTION_UP的X,Y坐标差,小于默认的滑动最小距离的事先,就认为是点击动作,将得到的position传递即可。最后让Activity实现这人 接口,获取参数,进行事件的处理就欧了~

本文已授权微信公众号:鸿洋(hongyangAndroid)在微信公众号平台原创首发。

4.RecyclerView的删除实现

3.RecyclerView的滑动实现

综上,亲戚亲戚当当我们都都 都儿想让子Item从右往左沿X轴的负方向滑动,scrollBy(X,0)中的X一定是大于0的

startScroll()两个参数依次为:刚现在开始移动时的X坐标;刚现在开始移动时的Y坐标;沿X轴移动距离,为负时,子控件向右移动;沿Y轴移动距离。肯能后面 没有 duration这人 参数,系统会使用默认的时长:250毫秒

假若调用invalidate()是使view进行重绘,在view的onDraw()方式中又会去调用computeScroll()方式,view不还都还能不能 实现弹性滑动

1.准备工作:

(1)数据准备:一有另一个存放数字的List数组来模拟RecyclerView的数据

(2)子Item的布局:整体线性布局水平排列,左侧是显示的次责,右侧是不显示的次责,也假若删除的次责。删除的次责是一有另一个相对布局,假若通过滑动的距离来控制字体与图片的显示与隐藏。

(3)RecyclerView三次责:RecyclerAdapter,RecyclerViewHolder,LayoutManager依次设置即可。

(1)通过触碰的坐标计算当前的position

这里亲戚亲戚当当我们都都 都儿肯定要自定义一有另一个MyRecyclerView继承自RecyclerView,假若重写onTouchEvent()方式,在MotionEvent.ACTION_DOWN的事先就要拿到你触碰的item的position。

欢迎Star,fork,提issues,一起进步!

Scroller的使用方式:

前面肯能实现了将一有另一个LinearLayout左右进行滑动,现在关键假若将这人 LinearLayout的滑动与亲戚亲戚当当我们都都 都儿RecyclerView的滑动相结合。

处理方式假若将这人 水平排列的LinearLayout作为子item布局的一次责,假若再获取每一有另一个item的LinearLayout就还都还能不能 进行滑动了。这里肯定需要一有另一个参数position,只有获取到item的position不还都还能不能 得到item的LinearLayout,不还都还能不能 进行删除操作。

其中itemLayout为一有另一个水平的LinearLayout,textView为LinearLayout中的”删除”,imageView为LinearLayout中的眼睛图片。

(3)滑动实现

现在滑动的方式与方向都肯能选则了,接下来的重点假若计算滑动的距离,也假若scrollBy(X,0)中的X的大小了。

这里有否则 很糙需要注意的是:这里遍历的是当前可见范围内的子项。使用getChildCount()与getChildAt()进行取值,只有是当前可见区域的子项!取值范围在0到getLastVisiblePosition()减去getFirstVisiblePosition()之间(可取等于)。

举个例子:

scrollTo(50,50)会将View位置移动到指定位置,多次调用无效

scrollBy(50,50)会将View位置移动到指定位置,每调用一次会在现有位置基础上进行移动

结合这人 例子分析一下,手指滑动的距离假若整体View移动的距离,没有 们还都还能不能 直接使用scrollBy(x,y)方式来进行处理,将手指滑动的距离作为第一有另一个参数传递进去,而不不考虑当前View滑动的位置。

当滑动的距离大于一半的事先,执行删除操作。 将删除方式写在RecyclerAdapter中:

(2)通过position得到item的viewHolder