发布网友 发布时间:2022-04-22 05:43
共1个回答
热心网友 时间:2023-09-20 13:05
1.利用OnScrollListener[java]viewplaincopymRecyclerView.addOnScrollListener(newRecyclerView.OnScrollListener(){privateinttotalDy=0;@OverridepublicvoidonScrolled(RecyclerViewrecyclerView,intdx,intdy){totalDy-=dy;}});如代码所述,totalDy的确保存了RecyclerView的滑动距离,但是当我向下滑动RecyclerView,之后插入/删除/移动Item的时候,totalDy就变得不精确了;比如删除或者插入新的Item,那么totalDy就不能再回归到0了。解决法:监听RecyclerView的addOnScrollListener后自己记录onScrolled的dy,同时给adapter加个registerAdapterDataObserver,监听插入/删除/移动,自己加减前面记录的dy滚动值。自己没有试过,不知道是否可行!2.有人说可以尝试computeVerticalScrollOffset()[java]viewplaincopytotalDy=recyclerView.computeVerticalScrollOffset();然而compute方法计算出的并不是滑动的精确距离,stackOverflow上有答案解释其为item的平均高度*可见item数目,不是我们需要的精确距离。3.还有人说可以尝试getChildAt(0)[java]viewplaincopytotalDy=recyclerView.getChildAt(0).getTop();依靠第一个item的滑动距离来进行动画的设置,但是根据该方法得出的totalDy在滑动到一定程度后清零。这是因为recyclerViewl.getChildAt(0)返回的永远是第一个可见的child,不是所有viewlist的第一个child,因此这种用法是得不到滑动距离的。另外下面这三种用法都是等价的,都是获取第一个可见的child:[java]viewplaincopyLinearLayoutManagerlayoutManager=(LinearLayoutManager)this.getLayoutManager();ViewfirstVisiableChildView=this.getChildAt(0);ViewfirstVisiableChildView=layoutManager.getChildAt(0)intposition=layoutManager.findFirstVisibleItemPosition();ViewfirstVisiableChildView=layoutManager.getChildAt(position)但是下面这种就不是获取第一个可见的child,而是获得所有viewlist的第一个child。但是滑动一段距离后它总是返回null,即第一个child被recycle后,总是返回null。[java]viewplaincopy//Don'tusethisfunctiontogetthefirstitem,itwillreturnnullwhenthefirstitemisrecycled.LinearLayoutManagerlayoutManager=(LinearLayoutManager)this.getLayoutManager();Viewchild2=layoutManager.findViewByPosition(0);4.如果LayoutManager用的是LinearLayoutManager,强烈推荐下面的方法获取滑动距离:[java]viewplaincopypublicintgetScollYDistance(){LinearLayoutManagerlayoutManager=(LinearLayoutManager)this.getLayoutManager();intposition=layoutManager.findFirstVisibleItemPosition();ViewfirstVisiableChildView=layoutManager.findViewByPosition(position);intitemHeight=firstVisiableChildView.getHeight();return(position)*itemHeight-firstVisiableChildView.getTop();}