RecyclerView & SnapHelper

SnapHelper

Google在support.design包24.2.0版本时添加了SnapHelper类,这个类用于结合RecyclerView使用,实现滑动之后确定RecyclerView Item的对齐方式:比如说居中、左对齐、顶部对齐等效果。SnapHelper是一个抽象类。Google官方有两个实现类

  • LinearSnapHelper:用来让Item居中显示。
  • PagerSnapHelper:则是在LinearSnapHelper的基础上限制一次只能滑动一个Item。更多效果请参考
    https://github.com/rubensousa/RecyclerViewSnap

SnapHelper详细请参考:http://www.jianshu.com/p/ef3a3b8d0a77

今天使用SnapHelper实现了一个电影列表的DEMO:效果图如下(GIF有点卡):

GIF.gif

还可以用来实现选择器:


RecyclerView & SnapHelper_第1张图片
QQ截图20170625234402.jpg

像上面的效果

相对的,ViewPager也可以实现差不多的效果,只不过RecyclerView + LinearSnapHelper 可以快速滑动,而且有着 RecyclerView 的特性。
如何选择,得根据项目的实际情况了。个人认为两种方式的优缺点如下:

  • ViewPager:单页滑动,可以使用setPageTransformer很轻松的实现滑动时切换的动画效果,而实现View的回收和复用则相对复杂。
  • RecyclerView:可以快速滑动也可以单页滑动,可是如果要实现页面切换效果则有点复杂,需要自定义LayoutManager,参考 https://github.com/Azoft/CarouselLayoutManager 而View的回收复用则无需使用者过多关心。

以上。

RecyclerView 判断滑动到底部的3种方法:

  • 首先获取RecyclerView的LayoutManager,通过判断最后一个可见的item的position是不是等于item总数-1。如果相等则可以判断滑动到底部。可以是有一种极端情况就是当totalItemCount等于1,而这个子项的高度比屏幕还要高时候,就会判断错误。当然这种情况几乎不会出现。
public static boolean isVisBottom(RecyclerView recyclerView){  
  LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();  
  //屏幕中最后一个可见子项的position
  int lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition();  
  //当前屏幕所看到的子项个数
  int visibleItemCount = layoutManager.getChildCount();  
  //当前RecyclerView的所有子项个数
  int totalItemCount = layoutManager.getItemCount();  
  //RecyclerView的滑动状态
  int state = recyclerView.getScrollState();  
  if(visibleItemCount > 0 && lastVisibleItemPosition == totalItemCount - 1 && state == recyclerView.SCROLL_STATE_IDLE){   
     return true; 
  }else {   
     return false;  
  }
}
  • 通过Recyclerview的computeVerticalScrollExtent()返回当前屏幕显示的区域高度,computeVerticalScrollOffset()返回之前已经滑动过的高度,computeVerticalScrollRange()返回整个控件的高度。当前显示高度 + 已经滑动过的高度 >= 整个空间高度的时候就是滑动到底部了。
public static boolean isSlideToBottom(RecyclerView recyclerView) {    
       if (recyclerView == null) return false; 
       if (recyclerView.computeVerticalScrollExtent() + recyclerView.computeVerticalScrollOffset() 
            >= recyclerView.computeVerticalScrollRange())   
         return true;  
       return false;
    }
  • 使用RecyclerView.canScrollVertically(1)来判断,返回false表示已经到底:这个方法的实现是根据第二点的参数来判断的。所以第二个方法和第三个方法是没什么区别的。
RecyclerView.canScrollVertically(1)的值表示是否能向上滚动,false表示已经滚动到底部
RecyclerView.canScrollVertically(-1)的值表示是否能向下滚动,false表示已经滚动到顶部

RecyclerView是一个很强大的类。以后我会在Adapter与LayoutManager的方向上深入去学习这个控件。

你可能感兴趣的:(RecyclerView & SnapHelper)