基于ListView和SwipeRefreshLayout的刷新加載

基于ListView和SwipeRefreshLayout的刷新加載(樓主親測好使)

先看效果:


aada.gif

介紹使用方法:
用了谷歌的SwipeRefreshLayout作為刷新控件:
xml配置:

1 (2).png

使用方法:
使用這個刷新加載需要注意 3點卿城;
1悲立、RefreshAndload new的時候募逞,需要放在listview.setAdapter后面
2肢专、當(dāng)網(wǎng)絡(luò)請求數(shù)據(jù)诞仓,返回后,需要停止加載欄的狀態(tài)【//停止刷新加載 refreshAndload.stopRefreshAndLoad();】
3逊移、當(dāng)你的fragment和activity退出時逻翁,請盡量 調(diào)用RefreshAndLoad這個類的【onDestroy();方法】

![W]8ZTBZL9@540HLY05D7F~W.png](http://upload-images.jianshu.io/upload_images/3066171-62e44cfa4ec3c450.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

下面就是 RefreshAndLoad 類的代碼

/**
* 刷新加載
* Created by xz on 2016/10/24 0024.
* 此類通過SwipeRefreshLayout,和listview的head氧急,實現(xiàn)了刷新和加載颗胡;
* 此類實現(xiàn)了listview的拉動監(jiān)聽,如果你需要用到listview的拉動監(jiān)聽吩坝,請使用本類中的拉動監(jiān)聽毒姨;
*/

public class RefreshAndLoad implements SwipeRefreshLayout.OnRefreshListener, View.OnClickListener {
   private Context context;
   private ListView listView;
   private SwipeRefreshLayout swipeRefreshLayout;
   private ProgressBar loadPB;//加載的進(jìn)度條
   private TextView loadTV;//加載的文字
   private OnLoadListener onLoadListener;//加載
   private OnRefreshListener onRefreshListener;//刷新
   private OnScrollListener onScrollListener;//拉動加載
   private View loadView;
   public final int LOADIS = 0;//正在加載
   public final int LOADClick = 1;//點擊加載更多...
   public final int LOADNO = 2;//暫無更多數(shù)據(jù)可加載
   public final int LOADGONE = 3;//隱藏加載欄
   public final int LOADVISIBLE = 4;//顯示加載欄
   public final int LOADERROR = 5;//加載錯誤
   public final int LOADSUCCESS = 6;//加載完成
   private boolean isLoad = false;//是否在加載   false-否;true-加載中
   private boolean isRefresh = false;//是否在刷新   false-否钉寝;true-刷新中

   /**
    * 只有加載的
    *
    * @param context
    * @param listView
    */
   public RefreshAndLoad(Context context, ListView listView) {
       init(context, listView, null);
   }

   /**
    * 只有刷新的
    *
    * @param context
    * @param swipeRefreshLayout
    */
   public RefreshAndLoad(Context context, SwipeRefreshLayout swipeRefreshLayout) {
       init(context, null, swipeRefreshLayout);
   }

   /**
    * 帶刷新加載的
    *
    * @param context
    * @param listView
    * @param swipeRefreshLayout
    */
   public RefreshAndLoad(Context context, ListView listView, SwipeRefreshLayout swipeRefreshLayout) {
       init(context, listView, swipeRefreshLayout);
   }

   /**
    * 初始化view
    */
   private void init(Context context, ListView listView, SwipeRefreshLayout swipeRefreshLayout) {
       this.context = context;
       this.listView = listView;
       this.swipeRefreshLayout = swipeRefreshLayout;
       if (listView != null) {
           //加載
           loadView = LayoutInflater.from(context).inflate(
                   R.layout.listview_load, null);
           loadView.setOnClickListener(this);
           loadPB = (ProgressBar) loadView.findViewById(R.id.listview_load_pb);
           loadTV = (TextView) loadView.findViewById(R.id.listview_load_tv);
           loadTV.setOnClickListener(this);
           listView.addFooterView(loadView, null, false);
           ListViewScrollListener();
           //默認(rèn)是隱藏加載欄的
           loadStatus(LOADGONE);
       }
       if (swipeRefreshLayout != null) {
           //刷新
           swipeRefreshLayout.setColorSchemeResources(R.color.danorange);
           swipeRefreshLayout.setOnRefreshListener(this);
       }
   }

   /**
    * 監(jiān)聽listview的滑動
    */
   public void ListViewScrollListener() {
       listView.setOnScrollListener(new AbsListView.OnScrollListener() {
           @Override
           public void onScrollStateChanged(AbsListView view, int scrollState) {
               if (onScrollListener != null) {
                   onScrollListener.onScrollStateChanged(view, scrollState);
               }
               //停止滑動
               if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE) {
                   //是否顯示加載
                   if (isShowLoad()) {
                       //是否是加載狀態(tài)
                       if (isLoad != true) {
                           loadStatus(LOADVISIBLE);
                           onLoad();
                       } else {
                           loadStatus(LOADClick);
                       }
                   } else {
                       loadStatus(LOADGONE);
                   }
               }
           }

           @Override
           public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
               if (onScrollListener != null) {
                   onScrollListener.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount);
               }
           }
       });
   }

   /**
    * 判斷是否顯示加載欄
    *
    * @return
    */
   public boolean isShowLoad() {
       //判斷l(xiāng)istview的條目
       if (this.listView.getCount() == 0) {
           return false;
       }
       //判斷l(xiāng)istview是否滑到最后一個
       if (listView.getLastVisiblePosition() == (listView.getCount() - 1)) {
           //判斷總條目是否大于可見條目弧呐,大于才說明,item是超過屏幕的
           if (listView.getCount() > listView.getChildCount()) {
               return true;
           }
       }
       return false;
   }


   /**
    * 刷新的
    */
   @Override
   public void onRefresh() {
       if (onRefreshListener != null) {
           onRefreshListener.onRefresh();
       }
   }

   /**
    * 加載的
    */
   public void onLoad() {
       isLoad = true;
       if (onLoadListener != null) {
           loadStatus(LOADIS);
           onLoadListener.onLoad();
       }
   }

   /**
    * 進(jìn)入app就刷新
    */
   public void immediatelyRefresh() {
       swipeRefreshLayout.post(new Runnable() {
           @Override
           public void run() {
               if (swipeRefreshLayout != null) {
                   swipeRefreshLayout.setRefreshing(true);
                   onRefresh();
               }
           }
       });
   }

   /**
    * 停止刷新瘩蚪,或者加載
    */
   public void stopRefreshAndLoad() {
       if (swipeRefreshLayout != null && swipeRefreshLayout.isRefreshing()) {
           swipeRefreshLayout.setRefreshing(false);
       }
       if (isLoad()) {
           isLoad = false;
           loadStatus(LOADClick);
       }
   }

   /**
    * 停止刷新泉懦,或者加載稿黍,
    *
    * @param status:加載顯示的狀態(tài)
    */
   public void stopRefreshAndLoad(int status) {
       if (swipeRefreshLayout != null && swipeRefreshLayout.isRefreshing()) {
           swipeRefreshLayout.setRefreshing(false);
       }
       if (isLoad()) {
           isLoad = false;
           loadStatus(status);
       }
   }

   /**
    * 停止刷新
    */
   public void stopRefresh() {
       if (swipeRefreshLayout != null && swipeRefreshLayout.isRefreshing()) {
           swipeRefreshLayout.setRefreshing(false);
       }
   }

   /**
    * 停止加載
    */
   public void stopLoad() {
       loadStatus(LOADGONE);
   }

   /**
    * int LOADIS = 0;//正在加載
    * int LOADClick = 1;//點擊加載更多...
    * int LOADNO = 2;//暫無更多數(shù)據(jù)可加載
    * int LOADGONE = 3;//隱藏加載欄
    * int LOADVISIBLE = 4;//顯示加載欄
    * int LOADERROR=5;//加載錯誤
    * int LOADSUCCESS = 6;//加載完成
    *
    * @param status:
    */
   public void loadStatus(int status) {
       switch (status) {
           case LOADIS:
               loadView.setVisibility(View.VISIBLE);
               loadTV.setText("正在加載...");
               loadPB.setVisibility(View.VISIBLE);
               break;
           case LOADClick:
               loadTV.setText("點擊加載更多...");
               loadPB.setVisibility(View.GONE);
               break;
           case LOADNO:
               loadTV.setText("暫無更多數(shù)據(jù)可加載");
               loadPB.setVisibility(View.GONE);
               break;
           case LOADGONE:
//                loadTV.setText("點擊加載更多...");
//                loadPB.setVisibility(View.GONE);
               loadPB.setVisibility(View.GONE);
               loadView.setVisibility(View.GONE);
               break;
           case LOADVISIBLE:
               loadView.setVisibility(View.VISIBLE);
               loadStatus(LOADClick);
               loadStatus(LOADIS);
               break;
           case LOADERROR:
               loadTV.setText("網(wǎng)絡(luò)錯誤疹瘦,點擊重試");
               loadPB.setVisibility(View.GONE);
               break;
           case LOADSUCCESS:
               loadTV.setText("加載完成");
               loadPB.setVisibility(View.GONE);
               break;
       }
   }

   /**
    * 刷新此控件
    */
   public void onRefreshThis() {
       stopRefreshAndLoad();
       //是否顯示加載
       if (isShowLoad()) {
           loadStatus(LOADClick);
       } else {
           loadStatus(LOADGONE);
       }
   }

   /**
    * 退出activity的時候,需要移除listview的footerview
    */
   public void onDestroy() {
       if (listView != null && loadView != null)
           listView.removeFooterView(loadView);
   }

   /**
    * 加載欄點擊事件
    *
    * @param v
    */
   @Override
   public void onClick(View v) {
       if (!isLoad()) {
           onLoad();
       }
   }

   public boolean isRefresh() {
       if (swipeRefreshLayout != null) {
           return swipeRefreshLayout.isRefreshing();
       } else {
           return false;
       }
   }

//    public void setRefresh(boolean refresh) {
//        isRefresh = refresh;
//    }

   public boolean isLoad() {
       return isLoad;
   }

   public void setLoad(boolean load) {
       isLoad = load;
   }

   public void setOnRefreshListener(OnRefreshListener onRefreshListener) {
       this.onRefreshListener = onRefreshListener;
   }

   public void setOnLoadListener(OnLoadListener onLoadListener) {
       this.onLoadListener = onLoadListener;
   }

   public void setOnScrollListener(OnScrollListener onScrollListener) {
       this.onScrollListener = onScrollListener;
   }

   /**
    * listview的加載監(jiān)聽
    */
   public interface OnLoadListener {
       void onLoad();
   }

   /**
    * listview的刷新監(jiān)聽
    */
   public interface OnRefreshListener {
       void onRefresh();
   }

   /**
    * listview的拉動監(jiān)聽
    */
   public interface OnScrollListener {
       void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount);

       void onScrollStateChanged(AbsListView view, int scrollState);
   }
}
   ```

加載欄【 listview_load.xml 】的代碼
```java
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:background="@color/transparent"
   android:gravity="center_vertical"
   android:padding="7dp">

   <ProgressBar
       android:id="@+id/listview_load_pb"
       style="?android:attr/progressBarStyle"
       android:layout_width="20dp"
       android:layout_height="20dp"
       android:layout_alignParentLeft="true"
       android:layout_alignParentStart="true"
       android:layout_alignParentTop="true"
       android:layout_marginLeft="30dp"
       android:layout_marginStart="56dp" />

   <TextView
       android:id="@+id/listview_load_tv"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_centerInParent="true"
       android:text="@string/refresh_more"
       android:textColor="@color/TextColorGray"
       android:textSize="15sp" />
</RelativeLayout>

輪子的原理巡球,集成和使用都比較簡單言沐,
如有bug,請留言酣栈;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末险胰,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子矿筝,更是在濱河造成了極大的恐慌起便,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窖维,死亡現(xiàn)場離奇詭異榆综,居然都是意外死亡,警方通過查閱死者的電腦和手機铸史,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門鼻疮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人琳轿,你說我怎么就攤上這事判沟」⑶郏” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵挪哄,是天一觀的道長吧秕。 經(jīng)常有香客問我,道長迹炼,這世上最難降的妖魔是什么寇甸? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮疗涉,結(jié)果婚禮上拿霉,老公的妹妹穿的比我還像新娘。我一直安慰自己咱扣,他們只是感情好绽淘,可當(dāng)我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著闹伪,像睡著了一般沪铭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上偏瓤,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天杀怠,我揣著相機與錄音,去河邊找鬼厅克。 笑死赔退,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的证舟。 我是一名探鬼主播硕旗,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼女责!你這毒婦竟也來了漆枚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤抵知,失蹤者是張志新(化名)和其女友劉穎墙基,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體刷喜,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡残制,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了吱肌。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片痘拆。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖氮墨,靈堂內(nèi)的尸體忽然破棺而出纺蛆,到底是詐尸還是另有隱情吐葵,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布桥氏,位于F島的核電站温峭,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏字支。R本人自食惡果不足惜凤藏,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望堕伪。 院中可真熱鬧揖庄,春花似錦、人聲如沸欠雌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽富俄。三九已至禁炒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間霍比,已是汗流浹背幕袱。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留悠瞬,地道東北人们豌。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像阁危,于是被迫代替她去往敵國和親玛痊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,262評論 25 707
  • 一提起沈從文狂打,估計很多人就會想起他的愛情名言: 我一輩子走過許多地方的路,行過許多地方的橋混弥,看過許多次數(shù)的云趴乡,喝過...
    清芷閱讀 5,240評論 4 13
  • 參考書目《回到初衷:一個日本創(chuàng)意鬼才的工作術(shù)》 每個人身邊都有那么一兩個腦洞大過天際的朋友晾捏。同一件事,從他們的眼里...
    萌小Q在路上閱讀 201評論 9 11
  • 有一個說法哀托,為何讀小說惦辛,是因為人生很短,幾十年的時間不夠支持我們?nèi)ソ?jīng)歷各式各樣的生活仓手,所以只能夠到小說里去胖齐。生活沒...
    江夏沛閱讀 331評論 0 1
  • 昨夜疾風(fēng)襲粵玻淑,天明厲雨傾城。飛花落葉樹凋零呀伙,亂紅敗綠殘影补履。 廣陌人煙罕跡,平阡雞犬無聲剿另。浸街淹巷路泓渟箫锤,破窗碎瓦衰境。
    泓穎閱讀 178評論 2 1