Android下拉刷新、上拉加載更多組件FlyRefreshLayout詳解

版權(quán)聲明:本文出自門心叼龍的博客,轉(zhuǎn)載請(qǐng)注明出處。 https://blog.csdn.net/geduo_83/article/details/87986968
舞動(dòng)著鍵盤和鼠標(biāo),我誓言要把這個(gè)世界寫的明明白白

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

無(wú)論是Android應(yīng)用,還是IOS應(yīng)用,我們每個(gè)app幾乎都離不開(kāi)下拉刷新和上拉加載更多的功能,這已經(jīng)作為一個(gè)app的最基本的功能, Android5.1之前并沒(méi)有提供系統(tǒng)原生的下拉刷新控件,直到android5.1開(kāi)始,谷歌的Android團(tuán)隊(duì)推出了一款下拉刷新控件SwipeRefeshLayout,但是只提供了下拉刷新的功能,并沒(méi)有提供上拉加載更多,想要了解更多,請(qǐng)移步官網(wǎng):https://developer.android.com/reference/android/support/v4/widget/SwipeRefreshLayout.html。

其實(shí)在谷歌官網(wǎng)推出之前,在github已經(jīng)開(kāi)源了很多Andriod下拉上拉的控件,比如人氣比較高的SuperSwipeRefreshLayout,F(xiàn)lyRefreshLayout刷新組件是基于SuperSwipeRefreshLayout進(jìn)行二次開(kāi)發(fā),有人可能會(huì)問(wèn)你為什么不自己寫這樣一個(gè)控件而要在別人的基礎(chǔ)上進(jìn)行二次開(kāi)發(fā),要知道在軟件開(kāi)發(fā)行業(yè)有一句很著名的話:“ 不要重復(fù)造輪子 ”,在日常的實(shí)戰(zhàn)開(kāi)發(fā)中,要求講究的是效率,領(lǐng)導(dǎo)要看的是結(jié)果,沒(méi)有必要做一些重復(fù)的工作,除非確實(shí)自己想研究一下,有充裕的閑暇時(shí)間也是未嘗不可。

FlyRefreshLayout刷新組件在原功能的基礎(chǔ)上增加了通用小菊花樣式DaisyRefreshLayout刷新控件和通用小箭頭樣式ArrowRefreshLayout刷新控件,支持RecyclerView,NestedScrollView,ScrollView 、ListView,GridView,能自定義HeadView和FooterView,不但支持最基本的下拉刷新、上拉加載更多,還在其基礎(chǔ)上擴(kuò)展了是否啟用下拉刷新、是否啟用上拉加載更多、增加了自動(dòng)刷新功能,優(yōu)化了下拉刷新監(jiān)聽(tīng)器、上拉加載更多監(jiān)聽(tīng)器,增加了自動(dòng)刷新監(jiān)聽(tīng)器,使其調(diào)用更加的方便。

二次開(kāi)發(fā)無(wú)外乎就這么幾個(gè)目的,要么增加了一些功能,要么是調(diào)用更加方便,要么就是增強(qiáng)了原代碼的安全性。在二次開(kāi)發(fā)的時(shí)候盡量不要在原類上的直接修改, 而在日常開(kāi)發(fā)過(guò)程中很多人都是采用簡(jiǎn)單粗暴的方式,直接在原類上改,隨著功能的增多,導(dǎo)致這個(gè)類的代碼及其臃腫,這樣一旦出現(xiàn)Bug排查起來(lái)也是非常痛苦的,因?yàn)槟悴恢赖降资亲约盒薷木蛯?dǎo)致的問(wèn)題,還是原來(lái)就存在這樣的Bug,再之也是對(duì)原作者的不尊重,因?yàn)檎l(shuí)都不愿意看到自己的代碼被被人改的爛七八糟。

功能演示:

小菊花樣式DaisyRefreshLayout;小箭頭樣式DaisyRefreshLayout


daisy.gif

arrow.gif

BaseRefreshLayout 作為擴(kuò)展的核心功能類,直接繼承了原類SuperSwipeRefreshLayout,增加了三個(gè)監(jiān)聽(tīng)器,一個(gè)自動(dòng)刷新的監(jiān)聽(tīng)器OnAutoLoadListener ,另外兩個(gè)是代理監(jiān)聽(tīng)器,OnRefreshListener、OnLoadMoreListener 來(lái)代理原類的自動(dòng)刷新監(jiān)聽(tīng)器和下拉刷新監(jiān)聽(tīng)器。另外擴(kuò)展了兩個(gè)非常重要的功能,禁用下拉刷新、禁用上拉加載更多的功能,這在原控件是不支持的,更多多細(xì)節(jié)我們就直接看源碼吧。

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;//下拉刷新監(jiān)聽(tīng)器
    protected OnLoadMoreListener mOnLoadMoreListener;//上拉加載更多監(jiān)聽(tīng)器
    protected OnAutoLoadListener mOnAutoLoadListener;//自動(dòng)加載的回調(diào)
    public interface OnRefreshListener{
        void onRefresh();
    }
    public interface OnLoadMoreListener{
        void onLoadMore();
    }
    //調(diào)用autoLoad的回調(diào)
    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;
    }
 
    /**
     * 自動(dòng)刷新
     */
    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
  • 支持自動(dòng)刷新
  • 支持啟用、禁用下拉刷新
  • 支持啟用、進(jìn)攻上拉加載更多
  • 通用小菊花樣式DaisyRefreshLayout
  • 通用小箭頭樣式ArrowRefreshLayout

類關(guān)系圖 :

  • 基本類圖


    image
  • HeadView關(guān)系圖:

    image

  • FootView關(guān)系圖:


    image

小菊花樣式DaisyRefreshLayout使用步驟:

1.創(chuàng)建布局文件

<?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.添加下拉刷新監(jiān)聽(tīng)器
 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.添加上拉加載更多的監(jiān)聽(tīng)器
 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.添加自動(dòng)刷新監(jiān)聽(tīng)器
 //自動(dòng)刷新回調(diào)監(jiān)聽(tīng)器
 mRefreshLayout.setOnAutoLoadListener(new DaisyRefreshLayout.OnAutoLoadListener() {
            @Override
            public void onAutoLoad() {
                Toast.makeText(getBaseContext(),"開(kāi)始加載數(shù)據(jù)了",Toast.LENGTH_SHORT).show();
            }
        });
//自動(dòng)刷新調(diào)用   
 mRefreshLayout.autoRefresh();
  • 4.停止刷新
mRefreshLayout.setRefreshing(false);
  • 5.停止加載更多
mRefreshLayout.setLoadMore(false);
  • 6.啟用、禁用下拉刷新
mRefreshLayout.setEnableRefresh(b);
7.啟用、禁用上拉加載更多

mRefreshLayout.setEnableLoadMore(b)

小箭頭樣式ArrowRefreshLayout的使用

小箭頭樣式ArrowRefreshLayout的使用方法和DaisyRefreshLayout的使用類似我就不演示了

功能演示:

小菊花樣式DaisyRefreshLayout;小箭頭樣式DaisyRefreshLayout

問(wèn)題反饋

在使用中有任何問(wèn)題,請(qǐng)?jiān)谙路搅粞?,或加入Android、Java開(kāi)發(fā)技術(shù)交流群
QQ群:810970432
email:geduo_83@163.com

關(guān)于作者

var geduo_83 = {
    nickName  : "門心叼龍",
    site : "http://www.weibo.com/geduo83"
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,228評(píng)論 4 61
  • 下拉刷新 & 上拉加載 課程目標(biāo) KVO的使用 UIScrollView使用 接口準(zhǔn)備 新浪微博下拉刷新與上拉加載...
    月下獨(dú)酌灬閱讀 1,856評(píng)論 4 12
  • Android UI相關(guān)開(kāi)源項(xiàng)目庫(kù)匯總OpenDigg 抽屜菜單MaterialDrawer ★7337 - 安卓...
    黃海佳閱讀 8,825評(píng)論 3 77

友情鏈接更多精彩內(nèi)容