美文网首页RecyclerView
RecyclerView & SnapHelper

RecyclerView & SnapHelper

作者: 劳达斯 | 来源:发表于2017-05-18 20:27 被阅读2442次

    SnapHelper

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

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

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

    GIF.gif

    还可以用来实现选择器:


    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

        本文链接:https://www.haomeiwen.com/subject/gecexxtx.html