参考文章: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;
}

原理:

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

3、滚动试验法

即尝试是否能滚动。

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

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

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

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

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

判断RecyclerView到达底部的几种方法的更多相关文章

  1. C#判断字符串为空的几种方法和效率判断

    C#判断字符串为空的几种方法和效率判断 string定义 1.1 string str1="":会定义指针(栈),并在内存里划一块值为空的存储空间(堆),指针指向这个空间.1.2 ...

  2. android 让一个控件按钮居于底部的几种方法

    android 让一个控件按钮居于底部的几种方法1.采用linearlayout布局:android:layout_height="0dp" <!-- 这里不能设置fill_ ...

  3. jQuery 判断checkbox是否被选中 4种方法

    下午写JS验证,有一个需求需要判断 checkbox是否被选择,查阅相关资料后,总结以下4种方法,分享给大家. <!DOCTYPE html> <html lang="en ...

  4. [Android] Android 让UI控件固定于底部的几种方法

    Android 让UI控件固定于底部的几种方法1.采用linearlayout布局:android:layout_height="0dp" <!-- 这里不能设置fill_p ...

  5. [转]android 让一个控件按钮居于底部的几种方法

    本文转自:http://www.cnblogs.com/zdz8207/archive/2012/12/13/2816906.html android 让一个控件按钮居于底部的几种方法 1.采用lin ...

  6. HTML中footer固定在页面底部的若干种方法

    <div class="header"><div class="main"></div></div> <d ...

  7. 如何通过PHP判断年份是否是闰年----两种方法

    1.定义:闰年是对4取余为0,对100取余不等于0,对400取余等于0的年是闰年. 2.代码: 第一种方法:直接函数判断 $day = date('Y'); if ($day%4==0&&am ...

  8. C# 判断字符串为空的4种方法及效率

    在程序开发过程中,少不了要处理字符串,并且常常要判断字符串是否为空,通常有哪些判断方法,以及不同方法的效率又怎么样? 在 C# 中,通常有三种判断字符串是否为空的方法,下面分别探讨. 1.str.Le ...

  9. js如何判断一个对象是不是Array? 三种方法总有一种可以帮上忙

    转载:http://www.nowamagic.net/librarys/veda/detail/1250 在开发中,我们经常需要判断某个对象是否为数组类型,在Js中检测对象类型的常见方法都有哪些呢? ...

随机推荐

  1. Quartus Prime 与 Modelsim 调试 及do文件使用

    Quartus Prime 与 Modelsim 调试 及do文件使用 2019-06-28 11:12:50 RushBTaotao 阅读数 49更多 分类专栏: IntelFPGA-Softwar ...

  2. C# xml转化为类集合

    XmlDocument doc = new XmlDocument(); doc.Load(HttpContext.Current.Server.MapPath("~/WebConfig/w ...

  3. 简述 IntentFilter(意图过滤器)

    1.什么是IntentFilter ? IntentFilter翻译成中文就是“意图过滤器”,主要用来过滤隐式意图.当用户进行一项操作的时候,Android系统会根据配置的 “意图过滤器” 来寻找可以 ...

  4. android ------ AndroidX的 Tablayout(com.google.android.material.tabs.TabLayout) 的使用

    前面呢,有写过TabLayout的博客,最近开发用到了AndroidX来解决前面的问题,不要工具类设置下划线的问题了,来总结一下 Android--------TabLayout实现新闻客户端顶部导航 ...

  5. layui 复选框checkbox 实现全选全选

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. PMP 第4章错题总结

    变更步骤: 1.配置管理活动:配置识别.配置状态记录.配置核实与审计2.项目章程中记录项目的目的和总体预算3.变更控制系统规定了变更管理流程及批准的权限4.项目章程是授权项目经理动用组织资源的文件5. ...

  7. Celery-系统守护进程

    1. 使用systemd控制Celery 用法: systemctl {start|stop|restart|status} celery.service 配置文件: /etc/celery/cele ...

  8. EasyDSS高性能RTMP、HLS(m3u8)、HTTP-FLV、RTSP流媒体服务器解决方案之Grunt的使用简介

    什么是Grunt? Grunt,简而言之,就是运行在Node.js上面的任务管理器(task runner),其可以在任何语言和项目中自动化指定的任务.我们可通过npm来安装Grunt和Grunt插件 ...

  9. Houdini Mac 添加external editor

     我的尝试: 1. 找到houdini.env文件 2. 修改env文件,添加 EDITOR = ""/Applications/Sublime Text.app/Contents ...

  10. 【论文阅读】FaceBoxes- CPU Real-time Face Detector with High Accuracy

    前言 参考 1. FaceBoxes_paper; 2. Faceboxes_github_tf; 3. 翻译: 4. 理解1: 5. 理解2: 完