需求

  • 实现功能——分批上拉加载。如分批加载每次30个,第一次显示30个item,上拉到底后,数据再添入30个,一共可显示60个item。
  • 上拉加载的控件——RecyclerView。
  • 上拉加载的时机——此次最后一个item在屏幕完全可见时(也可以是部分可见)。

实现(滑动刷新数据部分)

  • 准备添加下一批数据的方法

 /*** 分批加载 增加此批数据*/private void addNextDatas() {
//mPickRecipesList是可显示的所有item列表,有点冗余,但我复用了mTempList,这样是以免我这里数据出错
//mTempList是交给RecyclerView适配器的列表,通过改变这个列表数据,然后局部刷新if (mPickRecipesList != null) {int i = 0;//目前已经注入adapter的个数int position = mCurrentCount;//添加下一批数据while (position < mRecipes.size() && i < mAddCount) {mPickRecipesList.add(mRecipes.get(position));position++;i++;}mTempList = mPickRecipesList;mCurrentCount = mCurrentCount + mAddCount;}}
  • 准备判断RecyclerView滑到底部的方法(根据最后一个item是否完全可见)

View对象的getLocalVisibleRect(Rect rect)方法

首先Rect对象,是一个记录坐标的对象。有left、right、top、botton四个参数。分别代表

left:View的 左边 离屏幕 左边 的距离;

right:View的 右边 离屏幕 左边 的距离;

top:View的 顶部 离屏幕 顶部 的距离;

bottom:View的 底部 离屏幕 顶部 的距离;

是滴,我没有写错,就是这样的。

而确认RecyclerView中的item是否可见时,它的坐标是以自己为起点。

当使用recyclerView.getChildAt(最后一个item下标),获得最后一个item的View,当它的left=top=0,right=宽,bottom=高时,这个View在屏幕完全可见;当它的left=0,top!=0,right<宽,bottom<高,这个View在屏幕部分可见;

给getLocalVisibleRect(Rect rect)传入new Rect(0, 0, view.getWidth(), view.getHeight()),返回true可见,否则不可见。

 /*** 确定列表目前最后一个完全可见** @param view* @return*/private boolean isOnScreen(View view) {if (view != null) {int width = view.getWidth();int height = view.getHeight();Rect rect = new Rect(0, 0, width, height);return view.getLocalVisibleRect(rect);} else {MyLog.d(TAG, "isOnScreen view is null");}return false;}
  • 使用Handler处理界面刷新
 private final Handler mHandler = new Handler(Looper.myLooper()) {@Overridepublic void handleMessage(@NonNull Message msg) {super.handleMessage(msg);MyLog.d(TAG, "message is" + msg.what);switch (msg.what) {
//mRecipes是我所有要加载的总item列表
//mCurrentCount记录当前所有可显示的item数,也是下一批要放入的数据的开始下标case SCROLL_IDLE://到达当前底部 但数据还没加载完if (mRecipes != null && mCurrentCount < mRecipes.size()) {//记录下一批要放入的数据的开始下标,方便局部刷新int before = mRecipeGirdAdapter.getItemCount();//增加下一批数据addNextDatas();//局部刷新mRecipeGirdAdapter.notifyItemRangeChanged(before, mRecipeGirdAdapter.getItemCount() - before);}break;}}};
  • 给对应RecyclerView设置滑动监听事件

滑动时,根据判断最后一个item是否可见,结合滑动状态,判断是否滑到底部。

当非静止状态时候,不进行数据更新,防止边滑动边刷新会卡顿。

 /*** 监听滚动事件*/private void initRecyclerView() {if (mGridView != null) {mGridView.addOnScrollListener(new RecyclerView.OnScrollListener() {@Overridepublic void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {super.onScrollStateChanged(recyclerView, newState);//获取目前展示的列表最后一个item的viewboolean visible = isOnScreen(recyclerView.getChildAt(mCurrentCount - 1));//最后一个item可见if (visible) {switch (newState) {case RecyclerView.SCROLL_STATE_IDLE://静止状态 &&  加载if (!mHandler.hasMessages(SCROLL_IDLE)) {mHandler.sendEmptyMessage(SCROLL_IDLE);}break;case RecyclerView.SCROLL_STATE_DRAGGING:case RecyclerView.SCROLL_STATE_SETTLING://滑动时候到达最底部 不加载if (mHandler.hasMessages(SCROLL_IDLE)) {mHandler.removeMessages(SCROLL_IDLE);}break;}}}@Overridepublic void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {super.onScrolled(recyclerView, dx, dy);}});}}

希望你我日益成长。

android开发-RecyclerView上拉加载相关推荐

  1. 手把手教你实现Android RecyclerView上拉加载功能

    心灵鸡汤:知之者不如好之者,好之者不如乐之者. 摘要 一直在用到RecyclerView时都会微微一颤,因为一直都没去了解怎么实现上拉加载,受够了每次去Github找开源引入,因为感觉就为了一个上拉加 ...

  2. RecyclerView上拉加载Demo

    RecyclerView Load More Demo 日常开发中使用RecyclerView时会经常用到上拉加载的功能,但是RecyclerView本身又没有提供便捷的使用方法,只提供了一个统一的下 ...

  3. android SwipeRefreshLayout 增加上拉加载更多

    2019独角兽企业重金招聘Python工程师标准>>> 大家可能有的没有swipeRefreshLayout这个类,简单说一下,这是v4包里面的,19.1版本的时候就有了,但是当时的 ...

  4. android listview自动加载更多,如何实现 Android ListView『上拉加载更多』?

    ListView上拉加载更多的UI需求 (1)向上滑动 ListView,当最后一个条目滚入屏幕时开始加载更多条目,在列表底部增加一个 footerView:一个 infinite progressB ...

  5. Android recyclerview上拉加载更多

    记录一下视频列表(recyclerview)上拉显示一个"加载更多"的item,然后加载数据. 效果图: 实现思路: 1.写两个item布局,一个用来展示数据,一个用来展示加载中也 ...

  6. RecyclerView 下拉刷新上拉加载

    步骤: 首先直接定义一个XRecyclerView继承RecyclerView,重写他的三个构造方法. init(Context mContext)方法用来初始化底部加载的view 回到XRecycl ...

  7. BaseRecyclerViewAdapterHelper源码解读(四) 上拉加载更多

    上拉加载 上拉加载无需监听滑动事件,可自定义加载布局,显示异常提示,自定义异常提示. 此篇文章为BaseRecyclerViewAdapterHelper源码解读第四篇,开源库地址,如果没有看过之前3 ...

  8. 【FastDev4Android框架开发】RecyclerView完全解析之下拉刷新与上拉加载SwipeRefreshLayout(三十一)...

    转载请标明出处: http://blog.csdn.net/developer_jiangqq/article/details/49992269 本文出自:[江清清的博客] (一).前言: [好消息] ...

  9. Android RecyclerView封装下拉刷新与上拉加载更多

    1 scanlistlibrary 基础组件说明(基于 RecyclerView的封装) 基本数据列表(支持下拉刷新与上拉加载更多) 九宫格数据显示封装(支持下拉刷新与上拉加载更多) 瀑布流数据显示封 ...

最新文章

  1. matlab视频保存为图片
  2. 几经沉浮,人工智能前路何方?
  3. 推荐一款神器:在浏览器中运行 vscode,随时随地写代码
  4. Keras搭建深度学习模型,指定使用GPU来进行模型的训练和测试
  5. 计算机视觉库OpenCV初步了解
  6. 如何从零开始开发一个实时联机游戏?
  7. 阿里查出售假店主并索赔140万,这次是大数据帮的忙
  8. 线性代数第五版吉尔伯特课后答_线性代数同济第五版第六章课后习题答案!
  9. 前端学习(653):算数运算符
  10. html自动识别循环列表元素,动态添加的元素,怎么遍历它们的功能及内容
  11. Numpy 之 where理解
  12. if name==main是什么意思_VLOOKUP反向查找中的IF({1,0}是什么意思?
  13. EMNLP2021 | 标签推理的细粒度实体识别
  14. atitit.RESTful服务的概览and框架选型
  15. linux中telnet工具,linux中telnet工具的介绍和使用
  16. matlab 取矩阵上三角元素,MATLAB triu():提取上三角矩阵
  17. 信息系统项目管理师必背核心考点(四十一)风险管理计划
  18. 经验收藏:做网站的一些定律
  19. 溢出部分用省略号表示
  20. 两份重磅文件明确互联网平台分类分级,淘宝、微信、抖音等将迎“超级监管”...

热门文章

  1. 第一位计算机科学博士诞生 | 历史上的今天
  2. 使用驱动器X:中的光盘之前需要将其格式化,是否将其格式化格式化の解决办法
  3. 【路径规划】A_star算法智能仓储机器人移动避碰路径规划【含Matlab源码 1180期】
  4. android 7 屏幕断电,外媒眼中的一加7 Pro:使用过最快的Android手机
  5. 南开bbs——看完了就不会有人再感慨奶粉事件了...
  6. CEEMDAN:完全噪声辅助聚合经验模态分解(matlab)——学习笔记3
  7. 物联网卡是什么,是流量卡还是语音卡
  8. 高效能自动化港口数字化码头智慧港航,中国人工智能企业CIMCAI世界港航人工智能领军者,成熟港口码头人工智能产品中国人工智能企业
  9. python的sleep怎么实现的_sleep实现原理
  10. windows小技巧_1 设置图片查看器默认自适应缩放