Android下拉刷新、上拉加载更多组件FlyRefreshLayout详解

版权声明:本文出自门心叼龙的博客,转载请注明出处。 https://blog.csdn.net/geduo_83/article/details/87986968
舞动着键盘和鼠标,我誓言要把这个世界写的明明白白

框架github下载地址:https://github.com/geduo83/FlyRefreshLayout 欢迎star,加群:810970432交流

无论是Android应用,还是IOS应用,我们每个app几乎都离不开下拉刷新和上拉加载更多的功能,这已经作为一个app的最基本的功能, Android5.1之前并没有提供系统原生的下拉刷新控件,直到android5.1开始,谷歌的Android团队推出了一款下拉刷新控件SwipeRefeshLayout,但是只提供了下拉刷新的功能,并没有提供上拉加载更多,想要了解更多,请移步官网:https://developer.android.com/reference/android/support/v4/widget/SwipeRefreshLayout.html

其实在谷歌官网推出之前,在github已经开源了很多Andriod下拉上拉的控件,比如人气比较高的SuperSwipeRefreshLayout,FlyRefreshLayout刷新组件是基于SuperSwipeRefreshLayout进行二次开发,有人可能会问你为什么不自己写这样一个控件而要在别人的基础上进行二次开发,要知道在软件开发行业有一句很著名的话:“ 不要重复造轮子 ”,在日常的实战开发中,要求讲究的是效率,领导要看的是结果,没有必要做一些重复的工作,除非确实自己想研究一下,有充裕的闲暇时间也是未尝不可。

FlyRefreshLayout刷新组件在原功能的基础上增加了通用小菊花样式DaisyRefreshLayout刷新控件和通用小箭头样式ArrowRefreshLayout刷新控件,支持RecyclerView,NestedScrollView,ScrollView 、ListView,GridView,能自定义HeadView和FooterView,不但支持最基本的下拉刷新、上拉加载更多,还在其基础上扩展了是否启用下拉刷新、是否启用上拉加载更多、增加了自动刷新功能,优化了下拉刷新监听器、上拉加载更多监听器,增加了自动刷新监听器,使其调用更加的方便。

二次开发无外乎就这么几个目的,要么增加了一些功能,要么是调用更加方便,要么就是增强了原代码的安全性。在二次开发的时候尽量不要在原类上的直接修改, 而在日常开发过程中很多人都是采用简单粗暴的方式,直接在原类上改,随着功能的增多,导致这个类的代码及其臃肿,这样一旦出现Bug排查起来也是非常痛苦的,因为你不知道到底是自己修改就导致的问题,还是原来就存在这样的Bug,再之也是对原作者的不尊重,因为谁都不愿意看到自己的代码被被人改的烂七八糟。

功能演示:

小菊花样式DaisyRefreshLayout;小箭头样式DaisyRefreshLayout


daisy.gif

arrow.gif

BaseRefreshLayout 作为扩展的核心功能类,直接继承了原类SuperSwipeRefreshLayout,增加了三个监听器,一个自动刷新的监听器OnAutoLoadListener ,另外两个是代理监听器,OnRefreshListener、OnLoadMoreListener 来代理原类的自动刷新监听器和下拉刷新监听器。另外扩展了两个非常重要的功能,禁用下拉刷新、禁用上拉加载更多的功能,这在原控件是不支持的,更多多细节我们就直接看源码吧。

BaseRefreshLayout 
package com.fly.refresh;
 
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
 
/**
 * Description: <BaseRefreshLayout><br>
 * Author:      gxl<br>
 * Date:        2019/2/25<br>
 * Version:     V1.0.0<br>
 * Update:     <br>
 */
public abstract class BaseRefreshLayout extends SuperSwipeRefreshLayout {
    private boolean isEnableRefresh = true;//是否启用下拉刷新
    private boolean isEnableLoadMore = true;//是否启用上拉加载更多
    protected OnRefreshListener mOnRefreshListener;//下拉刷新监听器
    protected OnLoadMoreListener mOnLoadMoreListener;//上拉加载更多监听器
    protected OnAutoLoadListener mOnAutoLoadListener;//自动加载的回调
    public interface OnRefreshListener{
        void onRefresh();
    }
    public interface OnLoadMoreListener{
        void onLoadMore();
    }
    //调用autoLoad的回调
    public interface OnAutoLoadListener{
        void onAutoLoad();
    }
 
    public void setOnRefreshListener(OnRefreshListener onRefreshListener) {
        mOnRefreshListener = onRefreshListener;
    }
 
    public void setOnLoadMoreListener(OnLoadMoreListener onLoadMoreListener) {
        mOnLoadMoreListener = onLoadMoreListener;
    }
 
    public void setOnAutoLoadListener(OnAutoLoadListener onAutoLoadListener) {
        mOnAutoLoadListener = onAutoLoadListener;
    }
    public BaseRefreshLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    /**
     * 是否启用下拉刷新
     * @param enableRefresh
     */
    public void setEnableRefresh(boolean enableRefresh) {
        isEnableRefresh = enableRefresh;
    }
 
    /**
     * 是否启用加载更多
     * @param enableLoadMore
     */
    public void setEnableLoadMore(boolean enableLoadMore) {
        isEnableLoadMore = enableLoadMore;
    }
 
    /**
     * 自动刷新
     */
    public void autoRefresh(){
        postDelayed(new Runnable() {
            @Override
            public void run() {
                showRefresh();
                setRefreshing(true);
                if(mOnAutoLoadListener != null){
                    mOnAutoLoadListener.onAutoLoad();
                }
            }
        },1000 * 1);
    }
 
    /**
     * 如果禁用了加载更多则就直接返回了
     * @param ev
     * @param action
     * @return
     */
    @Override
    protected boolean handlerPushTouchEvent(MotionEvent ev, int action) {
        if (!isEnableLoadMore) {
            return false;
        }
        return super.handlerPushTouchEvent(ev,action);
    }
 
    /**
     * 如果禁用了就直接返回了
     * @param ev
     * @param action
     * @return
     */
    @Override
    protected boolean handlerPullTouchEvent(MotionEvent ev, int action) {
        if (!isEnableRefresh) {
            return false;
        }
        return super.handlerPullTouchEvent(ev,action);
    }
    public abstract void showRefresh();
}

小菊花刷新样式DaisyRefreshLayout 和小箭头刷新样式ArrowRefreshLayout的源码我就不分析了,大家就直接下载源码看吧。

主要功能

  • 支持最基本的下拉刷新、上拉加载更多
  • 支持自定义HeadView和FootView
  • 支持自动刷新
  • 支持启用、禁用下拉刷新
  • 支持启用、进攻上拉加载更多
  • 通用小菊花样式DaisyRefreshLayout
  • 通用小箭头样式ArrowRefreshLayout

类关系图 :

  • 基本类图


    image
  • HeadView关系图:

    image

  • FootView关系图:


    image

小菊花样式DaisyRefreshLayout使用步骤:

1.创建布局文件

<?xml version="1.0" encoding="utf-8"?>
<com.fly.refresh.DaisyRefreshLayout
    android:id="@+id/refresh_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <android.support.v4.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>    
</com.fly.refresh.DaisyRefreshLayout>
  • 2.添加下拉刷新监听器
 DaisyRefreshLayout mRefreshLayout = findViewById(R.id.refresh_layout);
 mRefreshLayout.setOnRefreshListener(new DaisyRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                Log.v(TAG,"refresh start");
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        Log.v(TAG,"response ok");
                        mRefreshLayout.setRefreshing(false);
                    }
                },1000 * 3);
            }
        });
  • 3.添加上拉加载更多的监听器
 mRefreshLayout.setOnLoadMoreListener(new DaisyRefreshLayout.OnLoadMoreListener() {
            @Override
            public void onLoadMore() {
                Log.v(TAG,"loadMore start");
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        Log.v(TAG,"response ok");
                        mRefreshLayout.setLoadMore(false);
                    }
                },1000 * 3);
            }
        });
  • 4.添加自动刷新监听器
 //自动刷新回调监听器
 mRefreshLayout.setOnAutoLoadListener(new DaisyRefreshLayout.OnAutoLoadListener() {
            @Override
            public void onAutoLoad() {
                Toast.makeText(getBaseContext(),"开始加载数据了",Toast.LENGTH_SHORT).show();
            }
        });
//自动刷新调用   
 mRefreshLayout.autoRefresh();
  • 4.停止刷新
mRefreshLayout.setRefreshing(false);
  • 5.停止加载更多
mRefreshLayout.setLoadMore(false);
  • 6.启用、禁用下拉刷新
mRefreshLayout.setEnableRefresh(b);
7.启用、禁用上拉加载更多

mRefreshLayout.setEnableLoadMore(b)

小箭头样式ArrowRefreshLayout的使用

小箭头样式ArrowRefreshLayout的使用方法和DaisyRefreshLayout的使用类似我就不演示了

功能演示:

小菊花样式DaisyRefreshLayout;小箭头样式DaisyRefreshLayout

问题反馈

在使用中有任何问题,请在下方留言,或加入Android、Java开发技术交流群
QQ群:810970432
email:geduo_83@163.com

关于作者

var geduo_83 = {
    nickName  : "门心叼龙",
    site : "http://www.weibo.com/geduo83"
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,943评论 4 60
  • 下拉刷新 & 上拉加载 课程目标 KVO的使用 UIScrollView使用 接口准备 新浪微博下拉刷新与上拉加载...
    月下独酌灬阅读 1,798评论 4 12
  • Android UI相关开源项目库汇总OpenDigg 抽屉菜单MaterialDrawer ★7337 - 安卓...
    黄海佳阅读 8,680评论 3 77