RecyclerView学习(三)

  • 时间:
  • 浏览:3
  • 来源:uu快3新平台_uu快3诀窍_讨论群

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

这里当我们当我们当我们当我们当我们当我们肯定要自定义另一三个MyRecyclerView继承自RecyclerView,之后 重写onTouchEvent()土土土办法,在MotionEvent.ACTION_DOWN的刚刚就要拿到你触碰的item的position。

(3)滑动实现

现在滑动的土土土办法与方向都是因为选用了,接下来的重点很多我计算滑动的距离,也很多我scrollBy(X,0)中的X的大小了。

首先向Scroller获取当前的滑动起点,通过scrollTo土土土办法实现滑动,之后 再调用invalidate()来进行重绘,又会调用computeScroll()土土土办法,之后 再获取当前的起点,使用scrollTo土土土办法滑动到新的位置。这麼往复,直到整个滑动开使。着实Scroller的设计思想很多我小幅度滑动组成整个的弹性滑动。

4.RecyclerView的删除实现

Scroller的使用土土土办法:

至此,另一三个漂亮的侧滑删除就是因为实现了,零碎的东西不少,记录下来一块儿学习~~

startScroll()三个参数依次为:开使移动时的X坐标;开使移动时的Y坐标;沿X轴移动距离,为负时,子控件向右移动;沿Y轴移动距离。是因为底下这麼duration两种参数,系统会使用默认的时长:2500毫秒

之后 调用invalidate()是使view进行重绘,在view的onDraw()土土土办法中又会去调用computeScroll()土土土办法,view都能否实现弹性滑动

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

(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就会向坐标轴正方向滑动。

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

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

初始化Scroller:

前面是因为实现了将另一三个LinearLayout左右进行滑动,现在关键很多我将两种LinearLayout的滑动与当我们当我们当我们当我们当我们当我们RecyclerView的滑动相结合。

正确处理土土土办法很多我将两种水平排列的LinearLayout作为子item布局的一每种,之后 再获取每另一三个item的LinearLayout就都都能否进行滑动了。这里肯定需要另一三个参数position,不都都能否获取到item的position都能否得到item的LinearLayout,都能否进行删除操作。

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

移动计算值 = 最开使点坐标 - 最后移动到的坐标

举个例子:

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

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

结合两种例子分析一下,手指滑动的距离很多我整体View移动的距离,原先们都都能否直接使用scrollBy(x,y)土土土办法来进行正确处理,将手指滑动的距离作为第另一三个参数传递进去,而不要考虑当前View滑动的位置。

RecyclerView的点击事件无非很多我接口回调获取position的过程,当我们当我们当我们当我们当我们当我们在MotionEvent.ACTION_DOWN的刚刚是因为拿到了position。这麼若果在点击的刚刚将两种position传递给Activity呢。现在若果判断哪此动作是点击就都都能否了!!!着实若果对比一下MotionEvent.ACTION_DOWN与MotionEvent.ACTION_UP的X,Y坐标差,小于默认的滑动最小距离的刚刚,就认为是点击动作,将得到的position传递即可。最后让Activity实现两种接口,获取参数,进行事件的正确处理就欧了~

viewHolder是存放视图与数据的地方,若果拿到当前item的viewHolder,就都都能否获取到当我们当我们当我们当我们当我们当我们的itemLayout,也很多我需要滑动的LinearLayout。RecyclerView提供了另一三个getChildViewHolder()的土土土办法来获取当前item的viewHolder,传进去的参数很多我通过getChildAt(index)获取到的view。

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

5.RecyclerView的滑动优化

刚刚说到当滑动的距离小于红块的一半,松开手指刚刚,会自动收缩当前item,之后 两种滑动比较生硬,用户体验很差。当我们当我们当我们当我们当我们当我们需要实现渐进式滑动,也很多我View的弹性滑动。这里当我们当我们当我们当我们当我们当我们使用的是Scroller。

欢迎Star,fork,提issues,一块儿进步!

https://github.com/18722527635/MyRecyclerView

在Listview当中,有另一三个pointToPosition(x, y)土土土办法都都能否根据坐标获取到当前的position,在RecyclerView中这麼两种土土土办法,需要当我们当我们当我们当我们当我们当我们个人动手写另一三个。

当我们当我们当我们当我们当我们当我们在上一步是因为拿到了item的position与itemLayout,在MotionEvent.ACTION_MOVE的刚刚使用itemLayout就都都能否进行滑动,在MotionEvent.ACTION_UP的刚刚使用position就都都能否进行删除。

2.View的滑动实现:

(1)滑动土土土办法:

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

3.RecyclerView的滑动实现

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

补充:

源码地址:

当滑动的距离大于一半的刚刚,执行删除操作。 将删除土土土办法写在RecyclerAdapter中:

1.准备工作:

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

(2)子Item的布局:整体线性布局水平排列,左侧是显示的每种,右侧是不显示的每种,也很多我删除的每种。删除的每种是另一三个相对布局,之后 通过滑动的距离来控制字体与图片的显示与隐藏。

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

评论里有小伙伴说加带点击事件后这麼效果,会产生事件冲突。谢谢这位小伙伴的提醒,刚刚这麼考虑这方面的问提。之后 周末在家完善了一下,看看怎么会会会么会正确处理的吧。

(2)通过position得到item的viewHolder

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