自己封装的工具类,使用原生SwipeRefreshLayout+RecycleView实现下拉刷新和加载更多
实现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实现下拉刷新和加载更多的更多相关文章
- android SwipeRefreshLayout google官方下拉刷新控件
		下拉刷新功能之前一直使用的是XlistView很方便我前面的博客有介绍 SwipeRefreshLayout是google官方推出的下拉刷新控件使用方法也比较简单 今天就来使用下SwipeRefres ... 
- Android v4包中的 SwipeRefreshLayout 官方的下拉刷新组件
		SwipeRefreshLayout在v4包下,相应的v4Demo中也有相应的样例.假设没有请下载最新support-v4 SwipeRefreshLayout 仅仅能有一个直接子View,可能是一个 ... 
- RecycleView + SwipeRefreshLayout 实现下拉刷新和底部自动加载
		前段时间项目里面使用了RecycleView 但是里面的刷新和加载都是框架里面封装好的,直接使用 这几天比较闲就自己来实现以下. 因为SwipeRefreshLayout是一个下拉刷新控件所有直接和R ... 
- Android下拉刷新-SwipeRefreshLayout
		现在市面上新闻类的App基本上都有下拉刷新,算是一个标配吧,网上关于下拉刷新的博客也有很多,实现方式可以使用开源的PullToRefresh,自定义ListView,或者可以直接使用LineLayOu ... 
- 【Android】使用 SwipeRefreshLayout 实现下拉刷新
		今天在codepath 上看到一个开源项目 [点击查看]使用到了 SwipeRefreshLayout 实现了下拉刷新,但演示样例并不完整,于是自己就动手写了下.之前看到郭霖的博客上也有介绍下拉刷新, ... 
- SwipeRefreshLayout下拉刷新
		1.SwipeRefreshLayout是Google在support v4 19.1版本的library更新的一个下拉刷新组件,实现刷新效果更方便. 弊端:只有下拉 //设置刷新控件圈圈的颜色 sw ... 
- android开发(49) Android 下拉刷新的实现。使用 SwipeRefreshLayout 代替 pull-to-refesh
		概述 谷歌官方推出了SwipeRefreshLayout 来实现下拉刷新的效果.对比以前我们常用的 pull-to-refesh ,这个方案显得更加的简单方便. 关联项目引用(管理依赖) 在你的 应用 ... 
- 安卓自带下拉刷新SwipeRefreshLayout加入上拉刷新功能
		在项目里面要用到刷新库.曾经都是使用第三方的.只是看到官方出了  SwipeRefreshLayout之后就用SwipeRefreshLayout.可是不知道什么原因官方SwipeRefreshL ... 
- .NET3.5中JSON用法以及封装JsonUtils工具类
		.NET3.5中JSON用法以及封装JsonUtils工具类 我们讲到JSON的简单使用,现在我们来研究如何进行封装微软提供的JSON基类,达到更加方便.简单.强大且重用性高的效果. 首先创建一个类 ... 
随机推荐
- 练习--python中的Queue与多进程(multiprocessing)
			按官方说法: This module is OBSOLETE and is only provided on PyPI to support old projects that still use i ... 
- OA学习笔记-005-Spring2.5与struts2.1整合
			一.单独测试strust 1.action package cn.itcast.oa.test; import org.springframework.context.annotation.Scope ... 
- PEP Index > PEP 339 -- Design of the CPython Compiler  译文
			http://www.python.org/dev/peps/pep-0339/ PEP: 339 标题: CPython的编译器设计 版本: 425fc5598ee8 最后修改: 2011-01-1 ... 
- perl use base 继承
			centos6.5:/root/podinns/lib#cat First.pm package First; use base qw(Second); sub new { my $self = {} ... 
- [LeetCode#156] Binary Tree Upside Down
			Problem: Given a binary tree where all the right nodes are either leaf nodes with a sibling (a left ... 
- efront二次开发记要
			efront系统是一套开源的在线学习系统,是用PHP编写的,内含“考试”功能.该系统的开源的是社区版,虽然看上去功能强大,但使用起来却很不符合国情.为了让公司使用,先做了一次最简化的二次开发,由于是最 ... 
- 【转】Android开发之旅:环境搭建及HelloWorld
			原文网址: http://www.cnblogs.com/skynet/archive/2010/04/12/1709892.html 引言 本系列适合0基础的人员,因为我就是从0开始的,此系列记录我 ... 
- 蓝桥杯--算法训练 区间k大数查询
			算法训练 区间k大数查询 时间限制:1.0 ... 
- VS2010+Oracle11+Entity Framework4.1环境搭建及常见问题(转)
			一,开场白: 在微软的实体数据模型中存在四种查询方式:SQL字符串:Linq:Linq to SQL:Linq to Entity(ESQL) 对于Linq SQL目前微软虽然仍在支持,但微软已经声明 ... 
- 哈希(1) hash的基本知识回顾
			好久没看数据结构了,现在也打不起精神来,翻了一下书,严蔚敏那本书.,以下是书的第9章,发现自己很多时候对知识的认识无法结构化和系统化,都是零散的,模糊的混乱的记忆,以后要有体系, 第9章 查找 ... 
