版權(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


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"
}