为RecyclerView添加下拉刷新(PullToRefresh)功能
在之前的文章中,我们实现了带有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)功能相关推荐
- refreshcontrol 实现下拉刷新的功能
该组件实现下拉刷新的功能.不过该组件是用在ScrollView的内部的,为ScrollView添加一个下拉刷新的功能.当ScrollView的垂直方向的偏移量scrollY:0的时候,手指往下拖拽Sc ...
- android 下拉刷新实现方式,Android RecyclerView设置下拉刷新的实现方法
Android RecyclerView设置下拉刷新的实现方法 1 集成 SwipeRefreshLayout 1.1 xml布局文件中使用 android:id="@+id/refresh ...
- android 设置下拉刷新,Android RecyclerView设置下拉刷新的实现方法
Android RecyclerView设置下拉刷新的实现方法 1 集成 SwipeRefreshLayout 1.1 xml布局文件中使用 android:id="@+id/refresh ...
- 采用SwipeFreshLayout+Recyclerview实现下拉刷新和上拉加载更多以及CoordinatorLayout的引入
之前都是采用PullToRefresh进行下拉刷新和下拉加载,现在采用谷歌自己的控件SwipeFreshLayout,配合Recyclerview来实现这一效果.使用SwipeRefreshLayou ...
- MVP+OKHttp+Recyclerview+Springview下拉刷新上拉加载
//activity -main布局 依赖 compile 'com.android.support:recyclerview-v7:25.0.0-alpha1' //springview实现上下拉的 ...
- android 官方上拉,手把手教你实现RecyclerView的下拉刷新和上拉加载更多
纵观多数App,下拉刷新和上拉加载更多是很常见的功能,但是谷歌官方只有一个SwipeRefreshLayout用来下拉刷新,上拉加载更多还要自己做. 基于RecyclerView简单封装了这两个操作, ...
- swift添加下拉刷新_React Native自定义下拉刷新组件
React Native 自定义下拉刷新组件 PullToRefresh 针对猴急一些的同学,可以先在这个 Expo网站在线运行下demo看看效果 . 完整的代码,在 Github仓库 . 下拉刷新, ...
- Android RecyclerView封装下拉刷新与上拉加载更多
1 scanlistlibrary 基础组件说明(基于 RecyclerView的封装) 基本数据列表(支持下拉刷新与上拉加载更多) 九宫格数据显示封装(支持下拉刷新与上拉加载更多) 瀑布流数据显示封 ...
- Android 高级编程【6个实战案例(附源码):刮刮卡、补间动画、逐帧动画、Fragment、RecyclerView、下拉刷新】
目 录 刮刮卡案例[ScratchCard] 结构图 activity_main.xml MainActivity.java 运行效果图 补间动画(Tween Animation) 逐帧动画(Fr ...
最新文章
- Oracle 作业学习总结
- __stdcall详解
- 多任务学习漫谈:以损失之名
- Android之用adb命令快速获取手机IP方法总结
- 第四十七期:毕业3年Java程序员,年薪20W,他是如何达到的?
- C++primer 第 4 章 表达式 4.1基础 4 . 2 算术运算符 4 .3 逻辑和关系运算符 4 . 4 赋值运算符 4 .5 递增和递减运算符 4.6成员访问运算符
- matlab案例_基于matlab和frost平台的cassie案例足式机器人运动学和动力学计算实现过程...
- python语言发展历时_编程语言十年发展史
- css3 Gradient 背景渐变
- 洛谷——P2415 集合求和
- ORB-SLAM2 ROS运行
- bootstarp怎么使盒子到最右边_基于Android血统的NAS+盒子共生体——零刻GS-king X 开箱初体验...
- Weblogic10.3.6反序列化漏洞补丁更新
- 加密系列 | SHA加密和解密算法详解代码示例
- C#--扁平化窗体UI
- 华为服务器 买回来带系统吗,购买服务器是否带操作系统
- 核桃编程学python吗_西瓜编程和核桃编程哪个好
- cmd命令打开文本文档_Windows10家庭版打开「本地组策略」
- 无法在 Mountain Lion 上启动 visual Paradigm 软件安装程序
- linux xz文件解压