在之前的文章中,我们实现了带有header和footer功能的WrapRecyclerView。

实现带header和footer功能的RecyclerView

实现带header和footer功能的RecyclerView——完善篇

现今App中列表的下拉刷新和上拉加载已经是一种习惯了,这两个操作也确实方便很多。

为RecyclerView添加这个功能可以通过多种方法,这里我选用了一种简单的做法。

因为在我们的App中我们一直在使用com.loopeer.android.thirdparty:pulltorefresh:<版本>这个库,所以这次也是基于这个库来实现。

首先要为WrapRecyclerView添加两个方法,如下:

    public int getFirstVisiblePosition(){int firstPosition = 0;LayoutManager layoutManager = getLayoutManager();if(layoutManager instanceof LinearLayoutManager){firstPosition = ((LinearLayoutManager) layoutManager).findFirstVisibleItemPosition();}if(layoutManager instanceof GridLayoutManager){firstPosition = ((GridLayoutManager) layoutManager).findFirstVisibleItemPosition();}if(layoutManager instanceof StaggeredGridLayoutManager){int[] positions = ((StaggeredGridLayoutManager) layoutManager).findFirstVisibleItemPositions(null);firstPosition = positions[0];}return firstPosition;}public int getLastVisiblePosition(){int lastPosition = 0;LayoutManager layoutManager = getLayoutManager();if(layoutManager instanceof LinearLayoutManager){lastPosition = ((LinearLayoutManager) layoutManager).findLastVisibleItemPosition();}if(layoutManager instanceof GridLayoutManager){lastPosition = ((GridLayoutManager) layoutManager).findLastVisibleItemPosition();}if(layoutManager instanceof StaggeredGridLayoutManager){int[] positions = ((StaggeredGridLayoutManager) layoutManager).findLastVisibleItemPositions(null);lastPosition = positions[positions.length - 1];}return lastPosition;}

这两个方法用于辅助判断滑动时是否到顶或到底,下面会用到。注意对于不同的LayoutManager使用不同的方式来获取。

新建一个PullToRefreshRecyclerView,继承PullToRefreshBase

public class PullToRefreshRecyclerView extends PullToRefreshBase<WrapRecyclerView>{

需要重写几个方法来实现功能,如

    @Overrideprotected boolean isReadyForPullEnd() {int lastPosition = getRefreshableView().getLastVisiblePosition();RecyclerView.LayoutManager layoutManager = getRefreshableView().getLayoutManager();View lastView = layoutManager.findViewByPosition(lastPosition);if(lastView != null) {int lastBottom = lastView.getBottom();return lastPosition == getRefreshableView().getRealItemCount() - 1 && lastBottom <= getRefreshableView().getBottom();}else{return true;}}@Overrideprotected boolean isReadyForPullStart() {int firstPosition = getRefreshableView().getFirstVisiblePosition();RecyclerView.LayoutManager layoutManager = getRefreshableView().getLayoutManager();View firstView = layoutManager.findViewByPosition(firstPosition);if(firstView != null) {int firstTop = firstView.getTop();return firstPosition == 0 && firstTop >= 0;}else{return true;}}

这两个方法会在滑动的时候被调用,判断是否已经到列表顶部或底部,如果到顶部或底部就会执行下拉/上拉的操作了。

逻辑比较简单,判断是否显示了第一个/最后一个item,并且它的top/bottom也显示了(说明这个item完整显示出来了)。

还需要重写另外一个方法

    @Overrideprotected WrapRecyclerView createRefreshableView(Context context, AttributeSet attrs) {WrapRecyclerView recyclerView = new WrapRecyclerView(context, attrs);recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {@Overridepublic void onScrollStateChanged(RecyclerView recyclerView, int newState) {super.onScrollStateChanged(recyclerView, newState);}@Overridepublic void onScrolled(RecyclerView recyclerView, int dx, int dy) {super.onScrolled(recyclerView, dx, dy);if(isReadyForPullStart()){recyclerView.clearFocus();}}});recyclerView.setId(R.id.pulltorefresh_recyclerview);return recyclerView;}

这个方法就是创建一个WrapRecyclerView,注意不要忘了setId,否则在Fragment中使用会出现一些问题(回收重建的时候)。

由于基于pulltorefresh库,所有功能库中都实现了,所以重写这几个方法就能实现下拉刷新功能了。实现效果如下

如果想改变显示或风格,可以通过pulltorefresh库的api来实现,关于pulltorefresh库的使用大家可以自行查阅相关文档,如果有时间我坑会整理一篇关于这个库的文章。

通过三篇文章我们对对RecyclerView功能进行扩展,目前基本可以满足大部分需求了。所以这部分就到此告一段落了,如果需要其他功能我们以后再来补充。谢谢大家!!

源码

完整源码请关注公众号:BennuCTech,发送“WrapRecyclerView”获取。

为RecyclerView添加下拉刷新(PullToRefresh)功能相关推荐

  1. refreshcontrol 实现下拉刷新的功能

    该组件实现下拉刷新的功能.不过该组件是用在ScrollView的内部的,为ScrollView添加一个下拉刷新的功能.当ScrollView的垂直方向的偏移量scrollY:0的时候,手指往下拖拽Sc ...

  2. android 下拉刷新实现方式,Android RecyclerView设置下拉刷新的实现方法

    Android RecyclerView设置下拉刷新的实现方法 1 集成 SwipeRefreshLayout 1.1 xml布局文件中使用 android:id="@+id/refresh ...

  3. android 设置下拉刷新,Android RecyclerView设置下拉刷新的实现方法

    Android RecyclerView设置下拉刷新的实现方法 1 集成 SwipeRefreshLayout 1.1 xml布局文件中使用 android:id="@+id/refresh ...

  4. 采用SwipeFreshLayout+Recyclerview实现下拉刷新和上拉加载更多以及CoordinatorLayout的引入

    之前都是采用PullToRefresh进行下拉刷新和下拉加载,现在采用谷歌自己的控件SwipeFreshLayout,配合Recyclerview来实现这一效果.使用SwipeRefreshLayou ...

  5. MVP+OKHttp+Recyclerview+Springview下拉刷新上拉加载

    //activity -main布局 依赖 compile 'com.android.support:recyclerview-v7:25.0.0-alpha1' //springview实现上下拉的 ...

  6. android 官方上拉,手把手教你实现RecyclerView的下拉刷新和上拉加载更多

    纵观多数App,下拉刷新和上拉加载更多是很常见的功能,但是谷歌官方只有一个SwipeRefreshLayout用来下拉刷新,上拉加载更多还要自己做. 基于RecyclerView简单封装了这两个操作, ...

  7. swift添加下拉刷新_React Native自定义下拉刷新组件

    React Native 自定义下拉刷新组件 PullToRefresh 针对猴急一些的同学,可以先在这个 Expo网站在线运行下demo看看效果 . 完整的代码,在 Github仓库 . 下拉刷新, ...

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

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

  9. Android 高级编程【6个实战案例(附源码):刮刮卡、补间动画、逐帧动画、Fragment、RecyclerView、下拉刷新】

    目   录 刮刮卡案例[ScratchCard] 结构图 activity_main.xml MainActivity.java 运行效果图 补间动画(Tween Animation) 逐帧动画(Fr ...

最新文章

  1. Oracle 作业学习总结
  2. __stdcall详解
  3. 多任务学习漫谈:以损失之名
  4. Android之用adb命令快速获取手机IP方法总结
  5. 第四十七期:毕业3年Java程序员,年薪20W,他是如何达到的?
  6. C++primer 第 4 章 表达式 4.1基础 4 . 2 算术运算符 4 .3 逻辑和关系运算符 4 . 4 赋值运算符 4 .5 递增和递减运算符 4.6成员访问运算符
  7. matlab案例_基于matlab和frost平台的cassie案例足式机器人运动学和动力学计算实现过程...
  8. python语言发展历时_编程语言十年发展史
  9. css3 Gradient 背景渐变
  10. 洛谷——P2415 集合求和
  11. ORB-SLAM2 ROS运行
  12. bootstarp怎么使盒子到最右边_基于Android血统的NAS+盒子共生体——零刻GS-king X 开箱初体验...
  13. Weblogic10.3.6反序列化漏洞补丁更新
  14. 加密系列 | SHA加密和解密算法详解代码示例
  15. C#--扁平化窗体UI
  16. 华为服务器 买回来带系统吗,购买服务器是否带操作系统
  17. 核桃编程学python吗_西瓜编程和核桃编程哪个好
  18. cmd命令打开文本文档_Windows10家庭版打开「本地组策略」
  19. 无法在 Mountain Lion 上启动 visual Paradigm 软件安装程序
  20. linux xz文件解压

热门文章

  1. C#事件-自定义事件
  2. ASP.NET在IIS7中上下文中不可用
  3. Python中关于使用正则表达式相关的部分笔记
  4. C# 单例模式的多种简单实现
  5. Oracle分析函数-OLAP函数总结
  6. 转:JAVA线程池ThreadPoolExecutor与阻塞队列BlockingQueue
  7. 百度面试测试开发工程师内容
  8. 查表法生成流水号的示例.sql
  9. sql server 2005 T-SQL @@MAX_PRECISION (Transact-SQL)
  10. IOS 关于ipad iphone5s崩溃 解决