实现SwipeRefreshLayout+RecycleView实现刷新

在你的xml文件里写上如下代码:

  1. <android.support.v4.widget.SwipeRefreshLayout
  2. android:id="@+id/SwipeRefreshLayout"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent">
  5. <android.support.v7.widget.RecyclerView
  6. android:id="@+id/recyclerView"
  7. android:layout_width="match_parent"
  8. android:layout_height="match_parent"
  9. android:cacheColorHint="#00000000"
  10. android:overScrollMode="never"
  11. android:scrollbars="none"/>
  12. </android.support.v4.widget.SwipeRefreshLayout>

在你的Activity或Fragment实现RecyclerViewLoadMoreUtil.RefreshDataListener刷新接口并调用以下代码初始化:

这里的init()方法中的
参数一:content
参数二:SwipeRefreshLayout控件
参数三:RecyclerView控件
参数四:继承RecyclerView.Adapter的adapter,这里可以使用我另外写的一篇关于adapter的封装
参数五:刷新接口,这里如果在Activity或Fragment实现RecyclerViewLoadMoreUtil.RefreshDataListener就可以在此处填this了

  1. recyclerViewLoadMoreUtil = new RecyclerViewLoadMoreUtil();
  2. recyclerViewLoadMoreUtil.init(mContext, mSwipeRefreshLayout, mRecyclerView, mAdapter, this);
  3. recyclerViewLoadMoreUtil.setColorSchemeResources(R.color.yellow_press, R.color.green, R.color.red);
  4. recyclerViewLoadMoreUtil.autoRefreshing();//第一次自动加载一次
  5. ....
  6. @Override
  7. public void onRefresh() {
  8. recyclerViewLoadMoreUtil.endRefreshing();
  9. //Do the things you want to do
  10. }
  11. @Override
  12. public boolean loadMore() {
  13. recyclerViewLoadMoreUtil.endLoading();
  14. //Do the things you want to do
  15. return true;
  16. }

下面介绍该工具类中的几个方法

  • autoRefreshing(); // 自动加载上拉刷新
  • endRefreshing();// 关闭SwipeRefreshLayout的小圆圈
  • endLoading();// 关闭加载更多
  • setPullDownRefreshEnable(boolean isRefresh);// 设置列表是否禁止下拉刷新,是否显示下拉刷新动画只能通过该方法设置
  • setPullUpRefreshEnable(boolean isLoadMore);// 设置列表是否禁止上拉刷新

以下是该刷新工具类的全部代码

  1. /**
  2. * Created by xiongxuesong-pc on 2016/6/17.
  3. * 配合原生RecyclerVew和SwipeRefreshLayout加载更多
  4. */
  5. public class RecyclerViewLoadMoreUtil {
  6. protected Context mContext;
  7. protected SwipeRefreshLayout mSwipeRefreshLayout;
  8. protected RecyclerView mRecyclerView;
  9. protected RecyclerView.Adapter mAdapter;
  10. protected RefreshDataListener mRefreshDataListener;
  11. private boolean mIsRefresh = true;//是否禁止下拉刷新,默认是不禁止下拉刷新
  12. private boolean mIsLoadMore = true;//是否禁止上拉刷新,默认是不禁止上拉刷新
  13. private boolean isSlidingToScreenBottom = false;//用来标记是否正在向最后一个滑动,既是否向右滑动或向下滑动
  14. public RecyclerViewLoadMoreUtil() {
  15. }
  16. public void init(final Context context, final SwipeRefreshLayout swipeRefreshLayout, RecyclerView recyclerView, final RecyclerView.Adapter adapter, final RefreshDataListener refreshDataListener) {
  17. initConfig(context, swipeRefreshLayout, recyclerView, adapter, refreshDataListener);
  18. swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
  19. @Override
  20. public void onRefresh() {
  21. boolean isRefreshing = swipeRefreshLayout.isRefreshing();
  22. if (isRefreshing) {
  23. refreshDataListener.onRefresh();
  24. }
  25. }
  26. });
  27. final LinearLayoutManager layoutManager = new LinearLayoutManager(context);
  28. recyclerView.setLayoutManager(layoutManager);
  29. recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
  30. @Override
  31. public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
  32. LinearLayoutManager manager = (LinearLayoutManager) recyclerView.getLayoutManager();
  33. // 当不滚动时
  34. boolean idleFlag = newState == RecyclerView.SCROLL_STATE_IDLE;
  35. if (idleFlag) {
  36. //获取最后一个完全显示的ItemPosition
  37. int lastVisibleItem = manager.findLastCompletelyVisibleItemPosition();
  38. int totalItemCount = mAdapter.getItemCount();
  39. // 判断是否滚动到屏幕底部,并且是向右滚动
  40. if (lastVisibleItem == (totalItemCount - 1) && isSlidingToScreenBottom) {
  41. if (mScrolledBottomListener != null) {
  42. mScrolledBottomListener.ScrolledBottom(recyclerView);
  43. }
  44. if (mIsLoadMore) {//可以加载更多
  45. mSwipeRefreshLayout.setEnabled(false);//禁止使用下拉刷新
  46. mRefreshDataListener.loadMore();
  47. Log.d("TAG", "howes right=" + manager.findLastCompletelyVisibleItemPosition());
  48. // Toast.makeText(mContext, "加载更多", Toast.LENGTH_SHORT).show();
  49. } else {
  50. // Toast.makeText(mContext, "不能加载更多", Toast.LENGTH_SHORT).show();
  51. }
  52. }
  53. }
  54. }
  55. @Override
  56. public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
  57. super.onScrolled(recyclerView, dx, dy);
  58. Log.d("TAG", "dy=" + dy);
  59. //dx用来判断横向滑动方向,dy用来判断纵向滑动方向
  60. //当列表项的总高度小于屏幕,即不会滚动列表时,dx、dy都等于0
  61. if (dy > 0) {
  62. //大于0表示,正在向右滚动,向上滚动
  63. isSlidingToScreenBottom = true;
  64. } else {
  65. //小于等于0 表示停止或向左滚动,向下滚动
  66. isSlidingToScreenBottom = false;
  67. }
  68. if (mScrollingListener != null) {
  69. mScrollingListener.scroll(isSlidingToScreenBottom);
  70. }
  71. }
  72. });
  73. }
  74. private void initConfig(Context context, SwipeRefreshLayout swipeRefreshLayout, RecyclerView recyclerView, RecyclerView.Adapter adapter, RefreshDataListener refreshDataListener) {
  75. this.mContext = context;
  76. this.mSwipeRefreshLayout = swipeRefreshLayout;
  77. this.mRecyclerView = recyclerView;
  78. this.mAdapter = adapter;
  79. this.mRefreshDataListener = refreshDataListener;
  80. }
  81. /**
  82. * 首次进入页面可以自动加载,要使用必须在{@link #init(Context, SwipeRefreshLayout, RecyclerView, RecyclerView.Adapter, RefreshDataListener)}
  83. * 之后调用
  84. */
  85. public void autoRefreshing() {
  86. mSwipeRefreshLayout.post(new Runnable() {
  87. @Override
  88. public void run() {
  89. mSwipeRefreshLayout.setRefreshing(true);
  90. mRefreshDataListener.onRefresh();
  91. }
  92. });
  93. }
  94. /**
  95. * 要使用必须在{@link #init(Context, SwipeRefreshLayout, RecyclerView, RecyclerView.Adapter, RefreshDataListener)}
  96. * 之后调用
  97. *
  98. * @param colorResIds
  99. */
  100. public void setColorSchemeResources(@ColorRes int... colorResIds) {
  101. mSwipeRefreshLayout.setColorSchemeResources(colorResIds);
  102. }
  103. public void endRefreshing() {
  104. mSwipeRefreshLayout.setRefreshing(false);
  105. }
  106. public void endLoading() {
  107. if (mIsRefresh) {//如果之前已经设置过禁止下拉刷新,此时不应该在设置成可下拉刷新
  108. setPullDownRefreshEnable(true);//可以使用下拉刷新
  109. } else {//如果之前已经设置过禁止下拉刷新,此时不应该在设置成可下拉刷新
  110. setPullDownRefreshEnable(false);//不可以使用下拉刷新
  111. }
  112. }
  113. /**
  114. * 设置列表是否禁止下拉刷新,是否显示下拉刷新动画只能通过该方法设置
  115. *
  116. * @param isRefresh true 可以使用下拉刷新;false 不可以使用下拉刷新
  117. */
  118. public void setPullDownRefreshEnable(boolean isRefresh) {
  119. mIsRefresh = isRefresh;
  120. mSwipeRefreshLayout.setEnabled(isRefresh);
  121. }
  122. /**
  123. * 设置列表是否禁止上拉刷新
  124. *
  125. * @param isLoadMore true 可以使用上拉刷新;false 不可以使用上拉刷新
  126. */
  127. public void setPullUpRefreshEnable(boolean isLoadMore) {
  128. mIsLoadMore = isLoadMore;
  129. }
  130. public interface RefreshDataListener {
  131. void onRefresh();
  132. boolean loadMore();
  133. }
  134. private ScrollingListener mScrollingListener;
  135. public interface ScrollingListener {
  136. /**
  137. * true 向上滚动;false 向下滚动
  138. *
  139. * @param scrollState
  140. */
  141. void scroll(boolean scrollState);
  142. }
  143. public void setScrollingListener(ScrollingListener listener) {
  144. mScrollingListener = listener;
  145. }
  146. private ScrolledBottomListener mScrolledBottomListener;
  147. public interface ScrolledBottomListener {
  148. /**
  149. * 列表滚动到屏幕底部时调用
  150. *
  151. * @param recyclerView
  152. */
  153. void ScrolledBottom(RecyclerView recyclerView);
  154. }
  155. public void setScrollingListener(ScrolledBottomListener listener) {
  156. mScrolledBottomListener = listener;
  157. }
  158. }

这是本人从项目中抽取出来的,暂时没在项目中出现问题,希望能帮助到你。

转载请注明出处,谢谢!

自己封装的工具类,使用原生SwipeRefreshLayout+RecycleView实现下拉刷新和加载更多的更多相关文章

  1. android SwipeRefreshLayout google官方下拉刷新控件

    下拉刷新功能之前一直使用的是XlistView很方便我前面的博客有介绍 SwipeRefreshLayout是google官方推出的下拉刷新控件使用方法也比较简单 今天就来使用下SwipeRefres ...

  2. Android v4包中的 SwipeRefreshLayout 官方的下拉刷新组件

    SwipeRefreshLayout在v4包下,相应的v4Demo中也有相应的样例.假设没有请下载最新support-v4 SwipeRefreshLayout 仅仅能有一个直接子View,可能是一个 ...

  3. RecycleView + SwipeRefreshLayout 实现下拉刷新和底部自动加载

    前段时间项目里面使用了RecycleView 但是里面的刷新和加载都是框架里面封装好的,直接使用 这几天比较闲就自己来实现以下. 因为SwipeRefreshLayout是一个下拉刷新控件所有直接和R ...

  4. Android下拉刷新-SwipeRefreshLayout

    现在市面上新闻类的App基本上都有下拉刷新,算是一个标配吧,网上关于下拉刷新的博客也有很多,实现方式可以使用开源的PullToRefresh,自定义ListView,或者可以直接使用LineLayOu ...

  5. 【Android】使用 SwipeRefreshLayout 实现下拉刷新

    今天在codepath 上看到一个开源项目 [点击查看]使用到了 SwipeRefreshLayout 实现了下拉刷新,但演示样例并不完整,于是自己就动手写了下.之前看到郭霖的博客上也有介绍下拉刷新, ...

  6. SwipeRefreshLayout下拉刷新

    1.SwipeRefreshLayout是Google在support v4 19.1版本的library更新的一个下拉刷新组件,实现刷新效果更方便. 弊端:只有下拉 //设置刷新控件圈圈的颜色 sw ...

  7. android开发(49) Android 下拉刷新的实现。使用 SwipeRefreshLayout 代替 pull-to-refesh

    概述 谷歌官方推出了SwipeRefreshLayout 来实现下拉刷新的效果.对比以前我们常用的 pull-to-refesh ,这个方案显得更加的简单方便. 关联项目引用(管理依赖) 在你的 应用 ...

  8. 安卓自带下拉刷新SwipeRefreshLayout加入上拉刷新功能

    在项目里面要用到刷新库.曾经都是使用第三方的.只是看到官方出了  SwipeRefreshLayout之后就用SwipeRefreshLayout.可是不知道什么原因官方SwipeRefreshL ...

  9. .NET3.5中JSON用法以及封装JsonUtils工具类

    .NET3.5中JSON用法以及封装JsonUtils工具类  我们讲到JSON的简单使用,现在我们来研究如何进行封装微软提供的JSON基类,达到更加方便.简单.强大且重用性高的效果. 首先创建一个类 ...

随机推荐

  1. Delphi xe10下载(包含破解补丁和破解视频)

    软件名称:RAD Studio 10 Seattle软件大小:7.18 GB RAD Studio 10 Seattle官方下载地址:http://altd.embarcadero.com/downl ...

  2. IP处理函数inet_aton()和inet_ntoa(),inet_pton,inet_ntop

    inet_ntoa: 功能: 将一个IP转换成一个互联网标准点分格式的字符串. 原型: char FAR * inet_ntoa( struct in_addr in); 返回值: 如果正确,返回一个 ...

  3. Lua table pair和ipair区别

    官方描述: ipairs (t) Returns three values: an iterator function, the table t, and 0, so that the constru ...

  4. [LeetCode#161] One Edit Distance

    Problem: Given two strings S and T, determine if they are both one edit distance apart. General Anal ...

  5. git fetch 拉取而不合并

    1.git fetch git fetch origin master:tmp git diff tmp git merge tmp git branch -d tmp          从远程获取最 ...

  6. (转载)PureMVC 练习时的注意事项

    (转载)http://blog.sina.com.cn/s/blog_4d5a45ce01010axd.html 1.主文件里实例化facade. 把主要的UI都放进去2.第二步创建VO3.UserF ...

  7. Legal or Not

    Legal or Not Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total ...

  8. 全新ASP框架——IISNODE介绍

    Asp是一门经典的动态网页编程语言,通常使用vbscript或者Jscript脚本来实现.一个好的框架,可以帮助您更加快速地使用Asp来完成您的网站开发任务.而Asp框架的终结者——IISNODE框架 ...

  9. APMServ5.2.6 升级PHP版本 到高版本 5.3,5.4

    首先下载:http://windows.php.net/downloads/releases/php-5.3.28-Win32-VC9-x86.zip  Thursday, December 12, ...

  10. 各种工具使得数据分析工作使用python变得越来越流行

    请参看文章:http://strata.oreilly.com/2013/03/python-data-tools-just-keep-getting-better.html