• 判断RecyclerView到达底部的几种方法


    参考文章:https://www.jianshu.com/p/c138055af5d2

    1、比较lastItem的pos

    通过比较当前屏幕可见最后一个item的position和整个RV的最后一个item的position,是同一个则到达底部。

    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;  
        }
    }
    

    上面通过LinearLayoutManager#findLastVisibleItemPosition()获取最后一个可见item的pos,导致最后一个item未完全显示时停止滑动,再滑动就会误判为到达底部。

    解决办法是将该方法换为LinearLayoutManager#findLastCompletelyVisibleItemPosition(),获取最后一个完全可见的item的pos。

    但是仍然会有个问题:如果lastItem高度超过屏幕高度,则无法正确判断。

    2、比较高度

    通过比较屏幕高度+View滑过的高度与View的总高度进行判断。

    public static boolean isSlideToBottom(RecyclerView recyclerView) {    
       if (recyclerView == null) return false; 
       if (recyclerView.computeVerticalScrollExtent() + recyclerView.computeVerticalScrollOffset() 
            >= recyclerView.computeVerticalScrollRange())   
         return true;  
       return false;
    }
    

    原理:

    image

    computeVerticalScrollExtent()是当前屏幕显示的区域高度,computeVerticalScrollOffset() 是当前屏幕之前滑过的距离,而computeVerticalScrollRange()是整个View控件的高度。

    3、滚动试验法

    即尝试是否能滚动。

    RecyclerView.canScrollVertically(1); // false表示已经滚动到底部
    RecyclerView.canScrollVertically(-1); // false表示已经滚动到顶部
    

    实际与第二种是相同的,canScrollVertically()的源码:

    image

    4、计算item高度与RV高度比较

    算出滑过的item的距离,加上屏幕高度,再与RV高度比较。

    实际与方法二原理一致,这里不再阐述。

  • 相关阅读:
    单进程架构数据库谨防隐形杀手
    21.2 超时与重传的简单例子
    19日下午三点直播:DevOps体系中数据库端的四大问题及解决之道
    SQL无所不能:DBA宝妈宝爸系列分享
    用Excel做了7天报表,这个领导喜欢的可视化工具,只用了7小时
    从块结构谈表的存储参数与性能之间的关系
    MYSQL SHELL 到底是个什么局 剑指 “大芒果”
    大数据构架师经典学习宝典
    POJ 3171 区间最小花费覆盖 (DP+线段树
    POJ 3171 区间最小花费覆盖 (DP+线段树
  • 原文地址:https://www.cnblogs.com/joahyau/p/10874511.html
Copyright © 2020-2023  润新知