Android智能下拉刷新框架-SmartRefreshLayout

轉(zhuǎn)載: Android智能下拉刷新框架-SmartRefreshLayout

English | 中文

SmartRefreshLayout以打造一個強(qiáng)大,穩(wěn)定,成熟的下拉刷新框架為目標(biāo)搀菩,并集成各種的炫酷、多樣、實(shí)用绕辖、美觀的Header和Footer。 正如名字所說擂红,SmartRefreshLayout是一個“聰明”或者“智能”的下拉刷新布局仪际,由于它的“智能”,它不只是支持所有的View昵骤,還支持多層嵌套的視圖結(jié)構(gòu)树碱。 它繼承自ViewGroup 而不是FrameLayout或LinearLayout,提高了性能变秦。 也吸取了現(xiàn)在流行的各種刷新布局的優(yōu)點(diǎn)成榜,包括谷歌官方的 SwipeRefreshLayout, 其他第三方的 Ultra-Pull-To-Refresh蹦玫、TwinklingRefreshLayout 赎婚。 還集成了各種炫酷的 Header 和 Footer。

SmartRefreshLayout

github 由于你懂的原因樱溉,下載速度緩慢挣输,圖片也無法查看,可以跳轉(zhuǎn) SmartRefreshLayout

特點(diǎn)功能:

  • 支持多點(diǎn)觸摸
  • 支持淘寶二樓和二級刷新
  • 支持嵌套多層的視圖結(jié)構(gòu) Layout (LinearLayout,FrameLayout...)
  • 支持所有的 View(AbsListView福贞、RecyclerView撩嚼、WebView....View)
  • 支持自定義并且已經(jīng)集成了很多炫酷的 Header 和 Footer.
  • 支持和 ListView 的無縫同步滾動 和 CoordinatorLayout 的嵌套滾動 .
  • 支持自動刷新、自動上拉加載(自動檢測列表慣性滾動到底部,而不用手動上拉).
  • 支持自定義回彈動畫的插值器完丽,實(shí)現(xiàn)各種炫酷的動畫效果.
  • 支持設(shè)置主題來適配任何場景的 App向瓷,不會出現(xiàn)炫酷但很尷尬的情況.
  • 支持設(shè)多種滑動方式:平移、拉伸舰涌、背后固定猖任、頂層固定、全屏
  • 支持所有可滾動視圖的越界回彈
  • 支持 Header 和 Footer 交換混用
  • 支持 AndroidX
  • 支持橫向刷新

傳送門

Demo

下載 APK-Demo

項(xiàng)目演示

個人首頁 微博列表
image
image
餐飲美食 個人中心
image
image

樣式演示 Style

Delivery DropBox
image
image
Refresh-your-delivery Dropbox-Refresh

上面這兩個是我自己實(shí)現(xiàn)的瓷耙,下面的是我把github上其它優(yōu)秀的Header進(jìn)行的整理和集合還有優(yōu)化:

BezierRadar BezierCircle
image
image
Pull To Refresh Pull Down To Refresh
FlyRefresh Classics
image
image
FlyRefresh ClassicsHeader
Phoenix Taurus
FunGame/BattleCity
image
Yalantis/Phoenix Yalantis/Taurus
BattleCity HitBlock
[
BattleCity
image
FunGame/BattleCity FunGame/HitBlock
WaveSwipe Material
image
image
WaveSwipeRefreshLayout MaterialHeader
StoreHouse WaterDrop
image
image
CRefreshLayout WaterDrop

看到這么多炫酷的Header朱躺,是不是覺得很棒?這時(shí)你或許會擔(dān)心這么多的Header集成在一起搁痛,但是平時(shí)只會用到一個长搀,是不是要引入很多無用的代碼和資源? V2.x 版本已經(jīng)把依賴庫拆分成8個包啦鸡典,用到的時(shí)候自行引用就可以啦源请!

  • refresh-layout-kernel 核心必須依賴
  • refresh-header-classics 經(jīng)典刷新頭
  • refresh-header-radar 雷達(dá)刷新頭
  • refresh-header-falsify 虛擬刷新頭
  • refresh-header-material 谷歌刷新頭
  • refresh-header-two-level 二級刷新頭
  • refresh-footer-ball 球脈沖加載
  • refresh-footer-classics 經(jīng)典加載

簡單用例

1.在 build.gradle 中添加依賴

【V1.1.0】 如果正在使用1.x 版本請調(diào)轉(zhuǎn),當(dāng)前2.0 版本已經(jīng)重定制彻况,不支持升級谁尸,請?jiān)谛马?xiàng)目中使用。

V2.x 相對于 V1.x 對包名做了修改如:com.scwang.smartrefresh 改為 com.scwang.smart.refresh纽甘。 建議在新項(xiàng)目中使用良蛮,如果項(xiàng)目升級,java悍赢,xml 中都需要做包名替換决瞳,比較麻煩。 但主要改動還是對 Smart 進(jìn)行分包左权,減小不必要的依賴皮胡,比如不使用二級刷新就不依賴,避免代碼冗余赏迟。 但是未對 SmartRefreshHeader 分包屡贺,里面有十多個Header,建議需要使用哪個就復(fù)制哪個的源碼到項(xiàng)目中瀑梗。 當(dāng)然:大家也可以在討論區(qū)討論投票烹笔,選出里面使用頻率比較高的Header裳扯,然后單獨(dú)分離出來抛丽。

compile 'com.android.support:appcompat-v7:25.3.1'                   //必須 25.3.1 以上

// 注意:分包之后不會有默認(rèn)的Header和Footer需要手動添加!還是原來的三種方法饰豺!
implementation  'com.scwang.smart:refresh-layout-kernel:2.0.1'      //核心必須依賴
implementation  'com.scwang.smart:refresh-header-classics:2.0.1'    //經(jīng)典刷新頭
implementation  'com.scwang.smart:refresh-header-radar:2.0.1'       //雷達(dá)刷新頭
implementation  'com.scwang.smart:refresh-header-falsify:2.0.1'     //虛擬刷新頭
implementation  'com.scwang.smart:refresh-header-material:2.0.1'    //谷歌刷新頭
implementation  'com.scwang.smart:refresh-header-two-level:2.0.1'   //二級刷新頭
implementation  'com.scwang.smart:refresh-footer-ball:2.0.1'        //球脈沖加載
implementation  'com.scwang.smart:refresh-footer-classics:2.0.1'    //經(jīng)典加載

如果使用 AndroidX 先在 gradle.properties 中添加亿鲜,兩行都不能少噢~

android.useAndroidX=true
android.enableJetifier=true

需要依賴 androidx.appcompat

implementation 'androidx.appcompat:appcompat:1.0.0'                 //必須 1.0.0 以上

implementation  'com.scwang.smart:refresh-layout-kernel:2.0.1'      //核心必須依賴
implementation  'com.scwang.smart:refresh-header-classics:2.0.1'    //經(jīng)典刷新頭
implementation  'com.scwang.smart:refresh-header-radar:2.0.1'       //雷達(dá)刷新頭
implementation  'com.scwang.smart:refresh-header-falsify:2.0.1'     //虛擬刷新頭
implementation  'com.scwang.smart:refresh-header-material:2.0.1'    //谷歌刷新頭
implementation  'com.scwang.smart:refresh-header-two-level:2.0.1'   //二級刷新頭
implementation  'com.scwang.smart:refresh-footer-ball:2.0.1'        //球脈沖加載
implementation  'com.scwang.smart:refresh-footer-classics:2.0.1'    //經(jīng)典加載

2.在XML布局文件中添加 SmartRefreshLayout

<?xml version="1.0" encoding="utf-8"?>
<com.scwang.smart.refresh.layout.SmartRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/refreshLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <com.scwang.smart.refresh.header.ClassicsHeader
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:overScrollMode="never"
        android:background="#fff" />
    <com.scwang.smart.refresh.footer.ClassicsFooter
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
</com.scwang.smart.refresh.layout.SmartRefreshLayout>

3.在 Activity 或者 Fragment 中添加代碼

RefreshLayout refreshLayout = (RefreshLayout)findViewById(R.id.refreshLayout);
refreshLayout.setRefreshHeader(new ClassicsHeader(this));
refreshLayout.setRefreshFooter(new ClassicsFooter(this));
refreshLayout.setOnRefreshListener(new OnRefreshListener() {
    @Override
    public void onRefresh(RefreshLayout refreshlayout) {
        refreshlayout.finishRefresh(2000/*,false*/);//傳入false表示刷新失敗
    }
});
refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() {
    @Override
    public void onLoadMore(RefreshLayout refreshlayout) {
        refreshlayout.finishLoadMore(2000/*,false*/);//傳入false表示加載失敗
    }
});

使用指定的 Header 和 Footer

1.方法一 全局設(shè)置

public class App extends Application {
    //static 代碼段可以防止內(nèi)存泄露
    static {
        //設(shè)置全局的Header構(gòu)建器
        SmartRefreshLayout.setDefaultRefreshHeaderCreator(new DefaultRefreshHeaderCreator() {
                @Override
                public RefreshHeader createRefreshHeader(Context context, RefreshLayout layout) {
                    layout.setPrimaryColorsId(R.color.colorPrimary, android.R.color.white);//全局設(shè)置主題顏色
                    return new ClassicsHeader(context);//.setTimeFormat(new DynamicTimeFormat("更新于 %s"));//指定為經(jīng)典Header,默認(rèn)是 貝塞爾雷達(dá)Header
                }
            });
        //設(shè)置全局的Footer構(gòu)建器
        SmartRefreshLayout.setDefaultRefreshFooterCreator(new DefaultRefreshFooterCreator() {
                @Override
                public RefreshFooter createRefreshFooter(Context context, RefreshLayout layout) {
                    //指定為經(jīng)典Footer,默認(rèn)是 BallPulseFooter
                    return new ClassicsFooter(context).setDrawableSize(20);
                }
            });
    }
}

注意:方法一 設(shè)置的Header和Footer的優(yōu)先級是最低的蒿柳,如果同時(shí)還使用了方法二饶套、三,將會被其它方法取代

2.方法二 XML布局文件指定

<com.scwang.smart.refresh.layout.SmartRefreshLayout
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/refreshLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#444444"
    app:srlPrimaryColor="#444444"
    app:srlAccentColor="@android:color/white"
    app:srlEnablePreviewInEditMode="true">
    <!--srlAccentColor srlPrimaryColor 將會改變 Header 和 Footer 的主題顏色-->
    <!--srlEnablePreviewInEditMode 可以開啟和關(guān)閉預(yù)覽功能-->
    <com.scwang.smart.refresh.header.ClassicsHeader
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="@dimen/dimenPaddingCommon"
        android:background="@android:color/white"
        android:text="@string/description_define_in_xml"/>
    <com.scwang.smart.refresh.footer.ClassicsFooter
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
</com.scwang.smart.refresh.layout.SmartRefreshLayout>

注意:方法二 XML設(shè)置的Header和Footer的優(yōu)先級是中等的垒探,會被方法三覆蓋妓蛮。而且使用本方法的時(shí)候,Android Studio 會有預(yù)覽效果圾叼,如下圖:

不過不用擔(dān)心蛤克,只是預(yù)覽效果,運(yùn)行的時(shí)候只有下拉才會出現(xiàn)~

3.方法三 Java代碼設(shè)置

final RefreshLayout refreshLayout = (RefreshLayout) findViewById(R.id.refreshLayout);
//設(shè)置 Header 為 貝塞爾雷達(dá) 樣式
refreshLayout.setRefreshHeader(new BezierRadarHeader(this).setEnableHorizontalDrag(true));
//設(shè)置 Footer 為 球脈沖 樣式
refreshLayout.setRefreshFooter(new BallPulseFooter(this).setSpinnerStyle(SpinnerStyle.Scale));

4.更多使用說明

混淆

SmartRefreshLayout 不需要添加混淆過濾代碼夷蚊,并且已經(jīng)混淆測試通過构挤,如果你在項(xiàng)目的使用中混淆之后出現(xiàn)問題,請及時(shí)通知我惕鼓。

友情鏈接

github/Loror
github/faith-hb/WidgetCase
github/Bamboy120315/Freedom
github/TommyLemon/APIJSON
github/dengyuhan
github/zrp2017
github/fly803/BaseProject
github/razerdp
github/SuperChenC/s-mvp
github/KingJA/LoadSir
github/jianshijiuyou
github/zxy198717
github/addappcn
github/RainliFu
github/sugarya
github/stormzhang

其他作品

MultiWaveHeader
SmartRefreshHorizontal
詩和遠(yuǎn)方

感謝

SwipeRefreshLayout
Ultra-Pull-To-Refresh
TwinklingRefreshLayout
BeautifulRefreshLayout

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末筋现,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子箱歧,更是在濱河造成了極大的恐慌矾飞,老刑警劉巖存捺,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件悍引,死亡現(xiàn)場離奇詭異,居然都是意外死亡钳榨,警方通過查閱死者的電腦和手機(jī)驼鹅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門微谓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人输钩,你說我怎么就攤上這事豺型。” “怎么了买乃?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵姻氨,是天一觀的道長。 經(jīng)常有香客問我剪验,道長肴焊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任功戚,我火速辦了婚禮娶眷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘啸臀。我一直安慰自己届宠,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著豌注,像睡著了一般伤塌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上轧铁,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天每聪,我揣著相機(jī)與錄音,去河邊找鬼齿风。 笑死熊痴,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的聂宾。 我是一名探鬼主播果善,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼系谐!你這毒婦竟也來了巾陕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤纪他,失蹤者是張志新(化名)和其女友劉穎鄙煤,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體茶袒,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡梯刚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了薪寓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片亡资。...
    茶點(diǎn)故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖向叉,靈堂內(nèi)的尸體忽然破棺而出锥腻,到底是詐尸還是另有隱情,我是刑警寧澤母谎,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布瘦黑,位于F島的核電站,受9級特大地震影響奇唤,放射性物質(zhì)發(fā)生泄漏幸斥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一咬扇、第九天 我趴在偏房一處隱蔽的房頂上張望甲葬。 院中可真熱鬧,春花似錦冗栗、人聲如沸演顾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽钠至。三九已至,卻和暖如春胎源,著一層夾襖步出監(jiān)牢的瞬間棉钧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工涕蚤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宪卿,地道東北人。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓万栅,卻偏偏與公主長得像佑钾,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子烦粒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評論 2 350