這是一個(gè)可自定義,多功能,多選擇,多神奇的下拉刷新,上拉加載的控件
刷新加載的動(dòng)圖效果,請(qǐng)看這里哦>源碼地址 https://github.com/scwang90/SmartRefreshLayout
build.gradle 中添加依賴
或者直接下載源代碼導(dǎo)入類(lèi)庫(kù)'refresh-layout','refresh-header','refresh-footer'
//1.1.0 API改動(dòng)過(guò)大奕谭,老用戶升級(jí)需謹(jǐn)慎
compile 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0-alpha-14'
compile 'com.scwang.smartrefresh:SmartRefreshHeader:1.1.0-alpha-14'//沒(méi)有使用特殊Header厘线,可以不加這行
compile 'com.android.support:appcompat-v7:25.3.1'//版本 23以上(必須)
//1.0.5 當(dāng)1.1.0出現(xiàn)問(wèn)題可以回退到1.0.5.1
compile 'com.scwang.smartrefresh:SmartRefreshLayout:1.0.5.1'
compile 'com.scwang.smartrefresh:SmartRefreshHeader:1.0.5.1'//沒(méi)有使用特殊Header璃岳,可以不加這行
compile 'com.android.support:appcompat-v7:25.3.1'//版本 23以上(必須)
compile 'com.android.support:design:25.3.1'//版本隨意(非必須斜脂,引用可以解決無(wú)法預(yù)覽問(wèn)題)
Application中全局設(shè)置Header 和 Footer
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);
}
});
}
}
在XML布局文件中添加 SmartRefreshLayout
<!--這是基礎(chǔ)款,沒(méi)有添加header,和footer,默認(rèn)使用經(jīng)典的刷新和加載-->
<com.scwang.smartrefresh.layout.SmartRefreshLayout
android:id="@+id/refreshLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:srlEnableFooterFollowWhenLoadFinished="true"
app:srlEnableScrollContentWhenLoaded="true"
android:layout_below="@+id/toolbar"
>
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
></android.support.v7.widget.RecyclerView>
</com.scwang.smartrefresh.layout.SmartRefreshLayout>
java代碼中的使用
SmartRefreshLayout refreshLayout = view.findViewById(R.id.refreshLayout);
//刷新的監(jiān)聽(tīng)事件
refreshLayout.setOnRefreshListener(new OnRefreshListener() {
@Override
public void onRefresh(@NonNull RefreshLayout refreshLayout) {
//請(qǐng)求數(shù)據(jù)
refreshLayout.finishRefresh(); //刷新完成
}
});
//加載的監(jiān)聽(tīng)事件
refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() {
@Override
public void onLoadMore(@NonNull RefreshLayout refreshLayout) {
refreshLayout.finishLoadMore(); //加載完成
refreshLayout.finishLoadMoreWithNoMoreData(); //全部加載完成,沒(méi)有數(shù)據(jù)了調(diào)用此方法
}
});
常用的用法
refreshLayout.autoRefresh();
//自動(dòng)刷新
refreshLayout.autoLoadMore();
//自動(dòng)加載更多
刷新完成和加載完成分為如下幾種情況
refreshLayout.finishRefresh();
//刷新完成
refreshLayout.finishRefresh(int delayed);
//刷新完成, 參數(shù)delayed 設(shè)置延時(shí)
refreshLayout.finishLoadMore();
//加載完成
refreshLayout.finishLoadMore(int delayed);
//加載完成, 參數(shù)delayed 設(shè)置延時(shí)
這兩個(gè)方法是在加載失敗時(shí)調(diào)用的
refreshLayout.finishRefresh(false);
//結(jié)束刷新(刷新失敗)
refreshLayout.finishLoadMore(false);
//結(jié)束加載(加載失斔┦隆)
refreshLayout.finishLoadMoreWithNoMoreData();
//全部加載完成,沒(méi)有數(shù)據(jù)了調(diào)用此方法
隱藏刷新加載的方法
refreshLayout.setEnableLoadMore(false);
//隱藏加載,不使用底部加載
refreshLayout.setEnableRefresh(false);
//不使用刷新,隱藏刷新
refreshLayout.setNoMoreData(false);
//恢復(fù)沒(méi)有更多數(shù)據(jù)的原始狀態(tài),版本 1.0.5
SmartRefreshLayout中的屬性講解
<attr name="srlDrawableSize" format="dimension"/><!--圖片尺寸-->
<attr name="srlDrawableArrowSize" format="dimension"/><!--箭頭圖片尺寸-->
<attr name="srlDrawableProgressSize" format="dimension"/><!--箭頭圖片尺寸-->
<attr name="srlDrawableMarginRight" format="dimension"/><!--圖片和文字的間距-->
<attr name="srlTextSizeTitle" format="dimension"/><!--標(biāo)題字體-->
<attr name="srlTextSizeTime" format="dimension"/><!--時(shí)間字體-->
<attr name="srlFinishDuration" format="integer"/><!--完成時(shí)停留時(shí)間-->
<attr name="srlPrimaryColor" format="color"/><!--主要顏色-->
<attr name="srlAccentColor" format="color"/><!--強(qiáng)調(diào)顏色-->
<attr name="srlDrawableArrow" format="reference"/><!--箭頭圖片-->
<attr name="srlDrawableProgress" format="reference"/><!--轉(zhuǎn)動(dòng)圖片-->
<attr name="srlEnableHorizontalDrag" format="boolean"/><!--支持水平拖動(dòng)-->
<attr name="srlClassicsSpinnerStyle" format="enum">
<enum name="Translate" value="0"/><!--平行移動(dòng)-->
<enum name="Scale" value="1"/><!--拉伸形變-->
<enum name="FixedBehind" value="2"/><!--固定在背后-->
</attr>
<attr name="layout_srlSpinnerStyle" format="enum">
<enum name="Translate" value="0"/><!--平行移動(dòng)-->
<enum name="Scale" value="1"/><!--拉伸形變-->
<enum name="FixedBehind" value="2"/><!--固定在背后-->
<enum name="FixedFront" value="3"/><!--固定在前面-->
<enum name="MatchLayout" value="4"/><!--填滿布局-->
</attr>
<declare-styleable name="SmartRefreshLayout">
<attr name="srlPrimaryColor"/> <!--主題顏色-->
<attr name="srlAccentColor"/> <!--強(qiáng)調(diào)顏色-->
<attr name="srlReboundDuration" format="integer"/> <!--釋放后回彈動(dòng)畫(huà)時(shí)長(zhǎng)-->
<attr name="srlHeaderHeight" format="dimension"/> <!--Header的標(biāo)準(zhǔn)高度-->
<attr name="srlFooterHeight" format="dimension"/> <!--Footer的標(biāo)準(zhǔn)高度-->
<attr name="srlHeaderInsetStart" format="dimension"/>
<attr name="srlFooterInsetStart" format="dimension"/>
<attr name="srlDragRate" format="float"/> <!--拖動(dòng)高度設(shè)置-->
<attr name="srlHeaderMaxDragRate" format="float"/> <!--Header最大拖動(dòng)高度/Header標(biāo)準(zhǔn)高度(默認(rèn)2沃斤,要求>=1)-->
<attr name="srlFooterMaxDragRate" format="float"/> <!--Footer最大拖動(dòng)高度/Footer標(biāo)準(zhǔn)高度(默認(rèn)2,要求>=1)-->
<attr name="srlHeaderTriggerRate" format="float"/> <!--設(shè)置Header觸發(fā)刷新距離 與 HeaderHieght 的比率(默認(rèn)1)-->
<attr name="srlFooterTriggerRate" format="float"/> <!--設(shè)置Footer觸發(fā)刷新距離 與 FooterHieght 的比率(默認(rèn)1)-->
<attr name="srlEnableRefresh" format="boolean"/> <!--是否開(kāi)啟下拉刷新功能(默認(rèn)true)-->
<attr name="srlEnableLoadMore" format="boolean"/> <!--是否開(kāi)啟加上拉加載功能(默認(rèn)true)-->
<attr name="srlEnableHeaderTranslationContent" format="boolean"/> <!--拖動(dòng)Header的時(shí)候是否同時(shí)拖動(dòng)內(nèi)容(默認(rèn)true)-->
<attr name="srlEnableFooterTranslationContent" format="boolean"/> <!--拖動(dòng)Footer的時(shí)候是否同時(shí)拖動(dòng)內(nèi)容(默認(rèn)true)-->
<attr name="srlHeaderTranslationViewId" format="reference"/>
<attr name="srlFooterTranslationViewId" format="reference"/>
<attr name="srlEnablePreviewInEditMode" format="boolean"/> <!--是否在編輯模式時(shí)顯示預(yù)覽效果(默認(rèn)true)-->
<attr name="srlEnableAutoLoadMore" format="boolean"/>
<attr name="srlEnableOverScrollBounce" format="boolean"/>
<attr name="srlEnablePureScrollMode" format="boolean"/>
<attr name="srlEnableNestedScrolling" format="boolean"/>
<attr name="srlEnableScrollContentWhenLoaded" format="boolean"/> <!--是否在加載完成之后滾動(dòng)內(nèi)容顯示新數(shù)據(jù)-->
<attr name="srlEnableScrollContentWhenRefreshed" format="boolean"/> <!--是否在刷新完成之后滾動(dòng)內(nèi)容顯示新數(shù)據(jù)-->
<attr name="srlEnableLoadMoreWhenContentNotFull" format="boolean"/>
<attr name="srlEnableFooterFollowWhenLoadFinished" format="boolean"/>
<attr name="srlEnableClipHeaderWhenFixedBehind" format="boolean"/>
<attr name="srlEnableClipFooterWhenFixedBehind" format="boolean"/>
<attr name="srlEnableOverScrollDrag" format="boolean"/>
<attr name="srlDisableContentWhenRefresh" format="boolean"/> <!--是否在刷新的時(shí)候禁止內(nèi)容的一切手勢(shì)操作(默認(rèn)false)-->
<attr name="srlDisableContentWhenLoading" format="boolean"/> <!--是否在加載的時(shí)候禁止內(nèi)容的一切手勢(shì)操作(默認(rèn)false)-->
<attr name="srlFixedHeaderViewId" format="reference"/>
<attr name="srlFixedFooterViewId" format="reference"/>
</declare-styleable>
設(shè)置SmartRefreshLayout中自帶酷炫的刷新頭
不會(huì)放動(dòng)圖,實(shí)在抱歉,放個(gè)截屏湊合一下吧,截圖來(lái)自smartREfreshLayout的github上
<com.scwang.smartrefresh.layout.SmartRefreshLayout
android:id="@+id/refreshLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:srlEnableFooterFollowWhenLoadFinished="true"
app:srlEnableScrollContentWhenLoaded="true"
android:layout_below="@+id/toolbar"
>
<!--盒子掉落的樣式 -->
<com.scwang.smartrefresh.header.DropBoxHeader
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:background="@color/white"
></android.support.v7.widget.RecyclerView>
<!--經(jīng)典的加載樣式-->
<com.scwang.smartrefresh.layout.footer.ClassicsFooter
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:srlClassicsSpinnerStyle="Translate" />
</com.scwang.smartrefresh.layout.SmartRefreshLayout>
只是把com.scwang.smartrefresh.header.DropBoxHeader換成了com.scwang.smartrefresh.header.DeliveryHeader
<!--減少篇幅,其余代碼和上圖代碼塊一只,只是DropBoxHeader換成了DeliveryHeader-->
<!--氣球的樣式 -->
<com.scwang.smartrefresh.header.DeliveryHeader
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<com.scwang.smartrefresh.layout.SmartRefreshLayout
android:id="@+id/refreshLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white"
app:srlHeaderMaxDragRate="2.5"
app:srlPrimaryColor="@android:color/darker_gray"
app:srlAccentColor="@android:color/white"
app:srlEnableLoadMore="false">
<!--srlHeaderMaxDragRate=2.5時(shí)候WaterDropHeader的下拉效果最好-->
<!--蘋(píng)果水滴的樣式-->
<com.scwang.smartrefresh.header.WaterDropHeader
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</com.scwang.smartrefresh.layout.SmartRefreshLayout
<!--全屏水波的樣式 -->
<com.scwang.smartrefresh.header.WaveSwipeHeader
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<!--金色校園的樣式 -->
<com.scwang.smartrefresh.header.PhoenixHeader
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
截圖直接看效果吧,雖說(shuō)不是動(dòng)圖,意思一下
貝塞爾雷達(dá)是在刷新包中 com.scwang.smartrefresh.layout.header.BezierRadarHeader