android RecyclerView的滚动事件OnScrollListener详解

2023-05-16

(1)滚动事件分类

列表的滚动一般分为两种:

1.手指按下 -> 手指拖拽列表移动 -> 手指停止拖拽 -> 抬起手指
2.手指按下 -> 手指快速拖拽后抬起手指 -> 列表继续滚动 -> 停止滚动

上面的过程的状态变化如下:

1.静止 -> 被迫拖拽移动 -> 静止
2.静止 -> 被迫拖拽移动 -> 自己滚动 -> 静止

(2)监听RecyclerView的滚动

有两种方式可以监听滚动事件:

1.setOnScrollListener(OnScrollListener listener)
2.addOnScrollListener(OnScrollListener listener)

其中 setOnScrollListener 由于可能出现空指针的风险,已经过时。建议用addOnScrollListener。
(3)OnScrollListener

/**

  • An OnScrollListener can be added to a RecyclerView to receive messages when a scrolling event
  • has occurred on that RecyclerView.
  • @see RecyclerView#addOnScrollListener(OnScrollListener)
  • @see RecyclerView#clearOnChildAttachStateChangeListeners()

/
public abstract static class OnScrollListener {
/
*
* Callback method to be invoked when RecyclerView’s scroll state changes.
*
* @param recyclerView The RecyclerView whose scroll state has changed.
* @param newState The updated scroll state. One of {@link #SCROLL_STATE_IDLE},
* {@link #SCROLL_STATE_DRAGGING} or {@link #SCROLL_STATE_SETTLING}.
*/
public void onScrollStateChanged(RecyclerView recyclerView, int newState){}

/**
 * Callback method to be invoked when the RecyclerView has been scrolled. This will be
 * called after the scroll has completed.
 * <p>
 * This callback will also be called if visible item range changes after a layout
 * calculation. In that case, dx and dy will be 0.
 *
 * @param recyclerView The RecyclerView which scrolled.
 * @param dx The amount of horizontal scroll.
 * @param dy The amount of vertical scroll.
 */
public void onScrolled(RecyclerView recyclerView, int dx, int dy){}

}

OnScrollListener类是个抽象类,有两个方法:

void onScrollStateChanged(RecyclerView recyclerView, int newState): 滚动状态变化时回调
void onScrolled(RecyclerView recyclerView, int dx, int dy): 滚动时回调

3.1 onScrollStateChanged(RecyclerView recyclerView, int newState)方法

回调的两个变量的含义:
recyclerView: 当前在滚动的RecyclerView
newState: 当前滚动状态.

其中newState有三种值:

/**

  • The RecyclerView is not currently scrolling.(静止没有滚动)
    */
    public static final int SCROLL_STATE_IDLE = 0;

/**

  • The RecyclerView is currently being dragged by outside input such as user touch input.
    *(正在被外部拖拽,一般为用户正在用手指滚动)
    */
    public static final int SCROLL_STATE_DRAGGING = 1;

/**

  • The RecyclerView is currently animating to a final position while not under outside control.
    *(自动滚动)
    */
    public static final int SCROLL_STATE_SETTLING = 2;

3.2 onScrolled(RecyclerView recyclerView, int dx, int dy)方法

回调的三个变量含义:
recyclerView : 当前滚动的view
dx : 水平滚动距离
dy : 垂直滚动距离

dx > 0 时为手指向左滚动,列表滚动显示右面的内容
dx < 0 时为手指向右滚动,列表滚动显示左面的内容
dy > 0 时为手指向上滚动,列表滚动显示下面的内容
dy < 0 时为手指向下滚动,列表滚动显示上面的内容
(4)canScrollVertically和canScrollHorizontally方法

public boolean canScrollVertically (int direction)
这个方法是判断View在竖直方向是否还能向上,向下滑动。
其中,direction为 -1 表示手指向下滑动(屏幕向上滑动), 1 表示手指向上滑动(屏幕向下滑动)。

public boolean canScrollHorizontally (int direction)
这个方法用来判断 水平方向的滑动

例如:
RecyclerView.canScrollVertically(1)的值表示是否能向下滚动,false表示已经滚动到底部
RecyclerView.canScrollVertically(-1)的值表示是否能向上滚动,false表示已经滚动到顶部
(5)两种判断是否到底部的方法:
5.1方法一:

如果 当前
第一个可见item的位置 + 当前可见的item个数 >= item的总个数
这样就可以判断出来,是在底部了。

loadingMoreListener = new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
}

    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);

        if (dy > 0) //向下滚动
        {
            int visibleItemCount = mLinearLayoutManager.getChildCount();
            int totalItemCount = mLinearLayoutManager.getItemCount();
            int pastVisiblesItems = mLinearLayoutManager.findFirstVisibleItemPosition();

            if (!loading && (visibleItemCount + pastVisiblesItems) >= totalItemCount) {
                loading = true;
                loadMoreDate();
            }
        }
    }

};

通过
visibleItemCount + pastVisiblesItems) >= totalItemCount
来判断是否是底部。
5.2方法二:

通过canScrollVertically 来判断

loadingMoreListener = new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if(!loading && !recyclerView.canScrollVertically(1)){
loading = true;
loadMoreDate();
}
}

@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
    super.onScrolled(recyclerView, dx, dy);

// if (dy > 0) //向下滚动
// {
// int visibleItemCount = mLinearLayoutManager.getChildCount();
// int totalItemCount = mLinearLayoutManager.getItemCount();
// int pastVisiblesItems = mLinearLayoutManager.findFirstVisibleItemPosition();
//
// if (!loading && (visibleItemCount + pastVisiblesItems) >= totalItemCount) {
// loading = true;
// loadMoreDate();
// }
// }
}
};

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android RecyclerView的滚动事件OnScrollListener详解 的相关文章

  • 如何使用 Android 和 (7.0) 使用 Google API 创建 AVD?

    当我下载并为 AVD 选择 N API 24 时 我在右下角看到以下消息 考虑使用带有 Google API 的系统映像来启用 Google Play 服务测试 此图片还不能使用吗 或者我错过了什么 我在 SDK 管理器中还没有看到它 从
  • 通过附加上下文改进 Android 语音识别

    据我了解 Android API 使用谷歌语音识别服务进行语音转文本 我已经学习了 API 我发现它非常简单 只需将语音转换为单词数组即可 有什么方法可以提高识别率 我的意思是 如果我知道上下文 我可以向服务发送一些参数以提高识别率吗 或者
  • 用于多个 ContentProvider 的 CursorLoader

    我需要制作一个 ListAdapter 来显示来自多个 ContentProvider 的数据 ContentProvider 本身代表关系数据库中的一张表 我想使用 CursorLoader 系统将聚合数据检索到 ListView 中 这
  • 以编程方式设置 imageView 的宽高比

    我在显示没有 centerCrop 的横向图像时遇到问题 我试过PercentFramelayout 并以编程方式设置纵横比 像这样 laParams percentLayoutInfo aspectRatio img width toFl
  • Android 键盘调整大小

    我正在开发一个应用程序 其中包含 Activity 和Fragment 在片段布局中 我使用相对布局作为父布局 底部和滚动视图之间的一个按钮 Scrollview包含编辑文本框 如果我点击最后一个editTextBox在滚动视图中我的键盘隐
  • 如何在 Android 中使用 Espresso 设置文本视图的值

    我正在为片段编写测试用例 我可以将文本设置为 Edittext 但无法通过测试将文本设置为文本视图 请任何人帮助我解决这个问题 贝娄是我用于编辑文本的代码 onView withId R id editText perform typeTe
  • 安卓。 onEditorAction 从未被调用

    我正在尝试捕捉从屏幕上移除键盘的事件 并且我正在使用OnEditorActionListener班级 然而 其onEditorAction方法永远不会被调用 这是我的 XML 格式的 EditText
  • Oreo (8.1) 无法在锁定屏幕上启动活动

    我正在开发 NFC 支付应用程序 即使设备锁定 屏幕打开时也可以付款 与 Android Pay 的行为基本相同 付款后 我想向用户显示胜利屏幕 通知他付款结果 完成 错误 PIN 请求等 我将其添加到清单中
  • 将 JSON 解析为 ListView

    好吧 我已经查看了大量有关解析 JSON 结果的示例 但没有运气 我有下面的 JSON 示例 我现在不需要状态信息或地理位置 我只想使用 station 对象并从数组中选择一些内容以列表形式显示在我的 ListView 中 我不明白那里的任
  • 如何动态设置每个 Gridview 图像项的边框

    我想显示每个 gridview 项目的不同边框 我如何动态地为每个项目设置边框
  • 当选择edittext时,主题/样式不会改变

    我的注册表单中有 Edittext 当用户触摸编辑文本时 编辑文本框变为绿色 表示选择了编辑文本 我不希望这样 当用户选择任何编辑文本时 行吹编辑文本保持白色 请检查此图片以获取更多说明 https i stack imgur com sl
  • 如何在 Android Fragments 中添加操作栏选项菜单

    我想在其中有一个选项菜单安卓碎片 ActionBar选项菜单未显示在我的片段中 这是我的代码 我都有onCreateOptionsMenu and onOptionSelected 功能 我的代码没有显示任何错误 但选项菜单未显示 pack
  • “您的 APP_BUILD_SCRIPT 指向未知文件:./jni/Android.mk”

    我搜索了整个网络 我认为 不管它说了什么 我尝试过 但仍然没有运气 不工作 我在cygwin和windows下都测试了它这是我的项目文件 目录 D Java 2 workspace indigo JniTest classpath D Ja
  • Android AsyncTask onPreExecute 未不确定地调用

    我有一个 AsyncTask 它应该在通过互联网上传一些内容时显示进度条 有时它就像一个魅力 有时它不显示任何进度条 这是代码 public class Upload extends AsyncTask
  • 方向更改时视图高度/宽度值错误?

    我实现了 onConfigurationChanged 来读取方向配置更改时视图高度和宽度的值 Override public void onConfigurationChanged Configuration newConfig supe
  • 如何在 Android 设备(平板电脑和手机)方向更改时获得正确的窗口宽度

    我正在尝试使用 jquery 函数计算 Android 设备方向变化时的窗口宽度 window outerWidth true 此计算给出了两个方向变化的正确宽度iphone and ipad但在安卓中不行 如果我最初以横向模式或纵向模式加
  • Android 中每个 dex 文件的方法限制为 64K

    我遇到了这个问题java lang IllegalArgumentException method ID not in 0 0xffff 65536我决定从 dex 文件中排除一些方法 我的 gradle build compile com
  • 如何在运行时将元数据信息写入Android Manifest

    我知道可以编辑 Android 清单组件 例如 将其设置为启用 禁用等 我想在运行时将元值标签插入到 Android 清单的应用程序标签中 我怎样才能直接写入android清单 这是我想直接写入我的应用程序的 Android 清单中的字符串
  • Camera中添加Camera的Zoom控件

    我正在制作一个相机应用程序 其中我使用 Surface View 作为相机和所有其他东西 我从以下链接中获取了指南 http www brighthub com mobile google android articles 43414 as
  • 如何使用 Retrofit 从异步回调返回 String 或 JSONObject?

    例如 调用 api getUserName userId new Callback

随机推荐

  • OSI七层解析及封装过程和解封装过程

    OSI七层解析及封装过程和解封装过程 文章目录 OSI七层解析及封装过程和解封装过程OSI七层模型 xff1a 一什么是OSI七层模型 xff1a 二 xff08 1 xff09 七层模型分别是哪七层 xff1a 三 xff08 1 xff
  • vscode如何调整字体大小

    1 打开vscode界面 2 找到界面左下角齿轮状管理按钮并点击 xff0c 然后点击弹出面板中的设置 setting 选项 3 进入设置界面 xff0c 找到Font Size设置输入框 xff0c 输入字体大小即可
  • 蓝桥杯刷题007——七段码

    七段码 七段码2020年第十一届蓝桥杯省赛 xff0c 填空题 xff0c lanqiao0J题号595 问题描述 七段数码管 xff0c 一共有7个发光二极管 xff0c 问能表示多少种不同的字符 xff0c 要求发光的二极管是相连的 七
  • C语言——辗转相除法求最大公约数

    一 题目分析 求12和18的最大公约数 xff0c 一般我们会想到从1开始一直到12除1 xff0c 18除1 xff0c 然后再一起除2 直到找出都能除到的最大公约数 xff0c 但是这样12和18我们至少要运行12次 xff0c 一旦数
  • 如何使用Flask在远程服务器上监控80端口并返回网页

    如何使用Flask在远程服务器上监控80端口并返回网页 介绍 随着科技的进步 xff0c 云计算和远程服务器成为了现代软件开发的常态 本文将介绍如何使用Python web框架Flask xff0c 在远程服务器上监控80端口并返回网页 F
  • GCC校园网无线转有线及多设备解决方案

    需要准备刷入padavan的路由器 我们学校用的是哆点的网络认证 xff0c GitHub上有很多方案了 xff0c 我就发一个我正在用的方案 首先抓取登录所用的GET请求 这里 xff0c 我们使用 Chrome 的开发者工具来抓取请求
  • vue3的setup语法糖<script setup>

    setup语法糖 模板中用到东西无需return 1 变量 方法不需要 return 出来 属性和方法也不用返回 xff0c 也不用写setup函数 xff0c 也不用写export default xff0c 甚至是自定义指令也可以在我们
  • Docker部署Grafana Loki日志收集系统

    官方参考文档 https grafana com docs loki latest installation docker Docker部署loki loki配置文件 xff08 二选一 xff09 使用命令下载loki config ya
  • c++新经典—c++基本语言

    13 1 语言特性 工程构成与可移植性 13 1 1 语言特性 xff1a 过程式 对象式程序设计 1 xff09 面向过程式的程序设计 C语言的编程风格是面向过程式的程序设计 所谓过程式的设计语言就是当编写代码解决一个问题时 xff0c
  • MySQL | 视图

    目录 一 创建视图 1 1 在单表上创建视图 1 2 在多表上创建视图 二 查看视图 2 1 使用DESCRIBE语句查看视图基本信息 2 2 使用SHOW TABLE STATUS语句查看视图基本信息 2 3 使用SHOW CREATE
  • c++---构造函数以及new和delete的使用

    目录 一 构造函数和析构函数的语法 二 构造函数的分类和调用 三 拷贝构造函数的调用时机 1 用已经创建好的对象来初始化新的对象 2 用值传递的方式 给函数参数传值 3 以值的方式 返回局部对象 四 构造函数调用规则 五 初始化列表 六 类
  • CMake Error at CMakeLists.txt:1:Parse error.Expected a command name, got unquoted argument with text

    问题 xff1a catkin make失败 xff0c CMakeLists txt报错 解决方法 1 CMake升级 通过查阅CMake升级博客 xff0c 个人觉得是这个问题概率较小 xff0c 也可以找编译成功的人 xff0c 通过
  • 【OpenCV图像处理6】滤波器

    文章目录 六 滤波器1 卷积1 1 什么是图像卷积1 2 步长1 3 padding1 4 卷积核的大小1 5 卷积案例 2 方盒滤波和均值滤波2 1 方盒滤波2 2 均值滤波 3 高斯滤波4 中值滤波5 双边滤波6 索贝尔 Sobel 算
  • Hadoop的Shell操作

    文章目录 Hadoop的Shell操作1 目录操作1 1 创建用户目录1 2 创建目录1 3 删除目录1 4 查看目录 2 文件操作2 1 上传文件2 2 查看文件2 3 下载文件2 4 拷贝文件 Hadoop的Shell操作 在使用Had
  • C语言之数组排序法

    1 冒泡排序法 冒泡排序算法的原理如下 xff1a 比较相邻的元素 xff0c 如果第一个比第二个大 xff0c 就交换他们两个 xff1b 对每一对相邻元素做同样的工作 xff0c 从开始第一对到结尾的最后一对 xff0c 在这一点 xf
  • c语言求最大公约数(辗转相除法)

    1 辗转相除法 xff1a 又称欧几里得算法 xff0c 用于计算两个非负整数a xff0c b的最大公约数 定理 xff1a 两个整数的最大公约数等于其中较小的那个数和两数相除余数的最大公约数 例如 xff1a 218 14 61 15
  • pdf文档打不开是怎么回事?

    当您无法打开PDF时 xff0c 可能是Acrobat Reader有问题 xff0c 也可能是更复杂的故障 xff0c 需要采取综合措施 先来了解一下pdf文档打不开是怎么回事 以下是 PDF 无法打开的主要原因 xff1a 不支持的文件
  • 遇到pdf文件损坏打不开要如何解决?

    在我们平时的办公中 xff0c 会使用电脑来编辑 接收各种电子文件 xff0c 大家会发现pdf文件是我们经常使用的一种文件类型 但是 xff0c 有时候 xff0c 我们会发现自己的pdf文件根本打不开 xff0c 相信很多朋友遇到这种情
  • excel表格打开是乱码怎么办?

    Excel软件很实用 xff0c 在日常办公使用频率很高 xff0c 但是有时会遇到excel表格打开是乱码怎么办 让我们一起来看一看吧 Excel乱码修复方法 1 打开Word xff0c 单击 文件 菜单中的 打开 命令 2 在文件类型
  • android RecyclerView的滚动事件OnScrollListener详解

    xff08 1 xff09 滚动事件分类 列表的滚动一般分为两种 1 手指按下 gt 手指拖拽列表移动 gt 手指停止拖拽 gt 抬起手指 2 手指按下 gt 手指快速拖拽后抬起手指 gt 列表继续滚动 gt 停止滚动 上面的过程的状态变化