实现SwipeRefreshLayout+RecycleView实现刷新

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

<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/SwipeRefreshLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:cacheColorHint="#00000000"
android:overScrollMode="never"
android:scrollbars="none"/>
</android.support.v4.widget.SwipeRefreshLayout>

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

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

recyclerViewLoadMoreUtil = new RecyclerViewLoadMoreUtil();
recyclerViewLoadMoreUtil.init(mContext, mSwipeRefreshLayout, mRecyclerView, mAdapter, this);
recyclerViewLoadMoreUtil.setColorSchemeResources(R.color.yellow_press, R.color.green, R.color.red);
recyclerViewLoadMoreUtil.autoRefreshing();//第一次自动加载一次
....
@Override
public void onRefresh() {
recyclerViewLoadMoreUtil.endRefreshing();
//Do the things you want to do
}
@Override
public boolean loadMore() {
recyclerViewLoadMoreUtil.endLoading();
//Do the things you want to do
return true;
}

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

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

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

/**
* Created by xiongxuesong-pc on 2016/6/17.
* 配合原生RecyclerVew和SwipeRefreshLayout加载更多
*/
public class RecyclerViewLoadMoreUtil {
protected Context mContext;
protected SwipeRefreshLayout mSwipeRefreshLayout;
protected RecyclerView mRecyclerView;
protected RecyclerView.Adapter mAdapter;
protected RefreshDataListener mRefreshDataListener;
private boolean mIsRefresh = true;//是否禁止下拉刷新,默认是不禁止下拉刷新
private boolean mIsLoadMore = true;//是否禁止上拉刷新,默认是不禁止上拉刷新
private boolean isSlidingToScreenBottom = false;//用来标记是否正在向最后一个滑动,既是否向右滑动或向下滑动 public RecyclerViewLoadMoreUtil() { } public void init(final Context context, final SwipeRefreshLayout swipeRefreshLayout, RecyclerView recyclerView, final RecyclerView.Adapter adapter, final RefreshDataListener refreshDataListener) {
initConfig(context, swipeRefreshLayout, recyclerView, adapter, refreshDataListener);
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
boolean isRefreshing = swipeRefreshLayout.isRefreshing();
if (isRefreshing) {
refreshDataListener.onRefresh();
}
}
}); final LinearLayoutManager layoutManager = new LinearLayoutManager(context);
recyclerView.setLayoutManager(layoutManager);
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
LinearLayoutManager manager = (LinearLayoutManager) recyclerView.getLayoutManager();
// 当不滚动时
boolean idleFlag = newState == RecyclerView.SCROLL_STATE_IDLE;
if (idleFlag) {
//获取最后一个完全显示的ItemPosition
int lastVisibleItem = manager.findLastCompletelyVisibleItemPosition();
int totalItemCount = mAdapter.getItemCount(); // 判断是否滚动到屏幕底部,并且是向右滚动
if (lastVisibleItem == (totalItemCount - 1) && isSlidingToScreenBottom) {
if (mScrolledBottomListener != null) {
mScrolledBottomListener.ScrolledBottom(recyclerView);
} if (mIsLoadMore) {//可以加载更多
mSwipeRefreshLayout.setEnabled(false);//禁止使用下拉刷新
mRefreshDataListener.loadMore();
Log.d("TAG", "howes right=" + manager.findLastCompletelyVisibleItemPosition());
// Toast.makeText(mContext, "加载更多", Toast.LENGTH_SHORT).show();
} else {
// Toast.makeText(mContext, "不能加载更多", Toast.LENGTH_SHORT).show();
}
}
}
} @Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
Log.d("TAG", "dy=" + dy);
//dx用来判断横向滑动方向,dy用来判断纵向滑动方向
//当列表项的总高度小于屏幕,即不会滚动列表时,dx、dy都等于0
if (dy > 0) {
//大于0表示,正在向右滚动,向上滚动
isSlidingToScreenBottom = true;
} else {
//小于等于0 表示停止或向左滚动,向下滚动
isSlidingToScreenBottom = false;
}
if (mScrollingListener != null) {
mScrollingListener.scroll(isSlidingToScreenBottom);
}
}
});
} private void initConfig(Context context, SwipeRefreshLayout swipeRefreshLayout, RecyclerView recyclerView, RecyclerView.Adapter adapter, RefreshDataListener refreshDataListener) {
this.mContext = context;
this.mSwipeRefreshLayout = swipeRefreshLayout;
this.mRecyclerView = recyclerView;
this.mAdapter = adapter;
this.mRefreshDataListener = refreshDataListener;
} /**
* 首次进入页面可以自动加载,要使用必须在{@link #init(Context, SwipeRefreshLayout, RecyclerView, RecyclerView.Adapter, RefreshDataListener)}
* 之后调用
*/
public void autoRefreshing() {
mSwipeRefreshLayout.post(new Runnable() {
@Override
public void run() {
mSwipeRefreshLayout.setRefreshing(true);
mRefreshDataListener.onRefresh();
}
});
} /**
* 要使用必须在{@link #init(Context, SwipeRefreshLayout, RecyclerView, RecyclerView.Adapter, RefreshDataListener)}
* 之后调用
*
* @param colorResIds
*/
public void setColorSchemeResources(@ColorRes int... colorResIds) {
mSwipeRefreshLayout.setColorSchemeResources(colorResIds);
} public void endRefreshing() {
mSwipeRefreshLayout.setRefreshing(false);
} public void endLoading() {
if (mIsRefresh) {//如果之前已经设置过禁止下拉刷新,此时不应该在设置成可下拉刷新
setPullDownRefreshEnable(true);//可以使用下拉刷新
} else {//如果之前已经设置过禁止下拉刷新,此时不应该在设置成可下拉刷新
setPullDownRefreshEnable(false);//不可以使用下拉刷新
}
} /**
* 设置列表是否禁止下拉刷新,是否显示下拉刷新动画只能通过该方法设置
*
* @param isRefresh true 可以使用下拉刷新;false 不可以使用下拉刷新
*/
public void setPullDownRefreshEnable(boolean isRefresh) {
mIsRefresh = isRefresh;
mSwipeRefreshLayout.setEnabled(isRefresh);
} /**
* 设置列表是否禁止上拉刷新
*
* @param isLoadMore true 可以使用上拉刷新;false 不可以使用上拉刷新
*/
public void setPullUpRefreshEnable(boolean isLoadMore) {
mIsLoadMore = isLoadMore;
} public interface RefreshDataListener {
void onRefresh(); boolean loadMore();
} private ScrollingListener mScrollingListener; public interface ScrollingListener {
/**
* true 向上滚动;false 向下滚动
*
* @param scrollState
*/
void scroll(boolean scrollState);
} public void setScrollingListener(ScrollingListener listener) {
mScrollingListener = listener;
} private ScrolledBottomListener mScrolledBottomListener; public interface ScrolledBottomListener {
/**
* 列表滚动到屏幕底部时调用
*
* @param recyclerView
*/
void ScrolledBottom(RecyclerView recyclerView);
} public void setScrollingListener(ScrolledBottomListener listener) {
mScrolledBottomListener = listener;
} }

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

转载请注明出处,谢谢!

自己封装的工具类,使用原生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. 【网络流24题】No.4 魔术球问题 (二分+最小路径覆盖)

    [题意] 假设有 n 根柱子, 现要按下述规则在这 n 根柱子中依次放入编号为 1, 2, 3, ¼的球.( 1)每次只能在某根柱子的最上面放球.( 2)在同一根柱子中,任何 2 个相邻球的编号之和为 ...

  2. [转贴]Linq之动态查询

    最近写Linq碰到一个问题, 就是如果要写一个查询系统,这个系统里面有很多TextBox可以填, 然后捞出符合各个字段的数据. 在SQL查询的时候还满方便的,用字符串连连连就可以了, ( 也就是sql ...

  3. oracle 大表删除数据后,回收空间的问题。

    在oracle中由于表结构设计不合理或者需要清楚老数据的时候,经常需要对大表数据进行清理. 一般有一下几种方法: 1. 删除大部分数据,留下小部分数据.我们可以把需要保留的数据转移到别的表,然后再把大 ...

  4. Android 应用页面延缓载入

    1.新建一个线程,使用handle的延缓运行线程 new Handler().postDelayed(new Runnable() { // 为了减少代码使用匿名Handler创建一个延时的调用 pu ...

  5. (转载)Linux一句话精彩

    (转载)http://bjsfly.blog.163.com/blog/static/161276642007845228371/ 0001[url=111]111[/url] [ 本帖最后由 bjc ...

  6. No setter found for property 'userDAO' in class 'com.ssh.service.impl.User1Service'

    造成此问题的原因是: 在applicationContext.xml中引用 <bean id="userService" class="com.ssh.servic ...

  7. HDU-1495 非常可乐(BFS)

    广搜的灵活应用题: 非常可乐 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  8. HDU-2710 Max Factor

    看懂: Max Factor Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  9. python 默认的系统编码 sys.setdefaultencoding

    python2.x的编码问题有时让人很头疼,一会ascii,一会unicode. 在脚本里多见这样的操作: import sys reload(sys) sys.setdefaultencoding( ...

  10. HDOJ/HDU 1256 画8(绞下思维~水题)

    Problem Description 谁画8画的好,画的快,今后就发的快,学业发达,事业发达,祝大家发,发,发. Input 输入的第一行为一个整数N,表示后面有N组数据. 每组数据中有一个字符和一 ...