Android下拉刷新控件PullToRefresh實例解析
Android中很多時候都會用到上下拉刷新,這是一個很常用的功能,Android的v4包中也為我們提供了一種原生的下拉刷新控件--SwipeRefreshLayout,可以用它實現(xiàn)一個簡潔的刷新效果,但今天我們的主角并不是它,而是一個很火的第三方的上下拉刷新控件--PullToRefresh。PullToRefresh包括PullToRefreshScrollView、PullToRefreshListView、PullToRefreshGridView等等很多為我們提供的控件,我們可以在xml文件中直接引入作為控件使用。
與一些其他的第三方庫不同,PullToRefresh的使用需要我們引用一個module作為依賴:
之后進(jìn)入我們的project的配置中心,快捷鍵是ctrl+alt+shift+s,然后選中你想要添加上下拉刷新的module,點擊右上角的加號,選擇Module dependency
:
然后一路點擊"OK",等待一會就可以將這個類庫附加到我們項目中了,我們就可以使用上下拉刷新了。
我們引入的第三方庫的目錄結(jié)構(gòu)是這樣的:
在xml文件中使用該控件的時候,注意要使用包名.類名的形式來引用你想要使用的控件,像這樣:
com.handmark.pulltorefresh.library.PullToRefreshListView
包名可以在我們引入的庫的module的AndroidManifest中查看,在目錄中的java文件夾下的類就是我們要使用的類。這里我們以PullToRefreshListView為例,其他的控件的使用方法類似。非常惡心的是控件里面的屬性沒有代碼提示...沒有代碼提示...沒有代碼提示!害的我對照了好幾遍,以為自己倒錯了module,結(jié)果是因為沒有代碼提示。
我們先來看幾個比較重要的方法:
//獲取帶有刷新的對應(yīng)控件 pullToRefreshListView.getRefreshableView(); /** * 設(shè)置刷新的模式:常用的有三種 * PullToRefreshBase.Mode.BOTH //上下拉刷新都可以 * PullToRefreshBase.Mode.PULL_FROM_START //只允許下拉刷新 * PullToRefreshBase.Mode.PULL_FROM_END //只允許上拉刷新 * */ pullToRefreshListView.setMode(PullToRefreshBase.Mode.PULL_FROM_END); //設(shè)置是否允許刷新的時候可以滑動 pullToRefreshListView.setScrollingWhileRefreshingEnabled(true);
當(dāng)我們通過getRefreshableView()獲得對應(yīng)的帶有刷新的控件(如使用PullToRefreshListView的時候,調(diào)用此方法會返回一個ListView實例)的時候會得到一個對應(yīng)的控件,比如說ListView,則listItem的點擊事件或者是數(shù)據(jù)適配我們就可以對這個獲取到的ListView進(jìn)行。
還有一個比較重要的方法就是為控件設(shè)置刷新時的監(jiān)聽:
pullToRefreshListView.setOnRefreshListener()
他有兩個參數(shù)可以傳,一個是
PullToRefreshBase.OnRefreshListener<T>
接口對應(yīng)的匿名內(nèi)部類形式。一個是
PullToRefreshBase.OnRefreshListener2<T>
接口對應(yīng)的匿名內(nèi)部類形式。其中一般上下拉刷新同時可用的時候我們選擇第二個形式:
pullToRefreshListView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>() { //完成下拉刷新操作 @Override public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) { } //完成上拉刷新操作 @Override public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) { } });
當(dāng)然,PullToRefresh還有一個重要方法就是
pullToRefreshListView.onRefreshComplete();
此方法用來通知刷新完成了,取消刷新動畫,如果不加這一句,會一直顯示一個刷新動畫。這里我們模擬一些數(shù)據(jù),并且在下拉刷新的時候使用線程讓程序睡2s,然后再隨機(jī)加載一條新數(shù)據(jù)并通知Adapter更新UI,完成代碼如下:
package ggcomic.rabbit.lx.pulltorefresh; import android.os.Handler; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.ArrayAdapter; import android.widget.ListView; import com.handmark.pulltorefresh.library.LoadingLayoutProxy; import com.handmark.pulltorefresh.library.PullToRefreshBase; import com.handmark.pulltorefresh.library.PullToRefreshListView; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity { private PullToRefreshListView pullToRefreshListView; private ListView lv; private List<String> datas; private ArrayAdapter<String> adapter; private Handler handler=new Handler(); private LoadingLayoutProxy llProxy;//設(shè)置刷新時的文本等的對象 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); pullToRefreshListView = (PullToRefreshListView) findViewById(R.id.pull); datas=new ArrayList<>(); for(int i=1;i<=50;i++){ datas.add("item---------"+i); } //獲取帶有刷新的對應(yīng)控件 lv = pullToRefreshListView.getRefreshableView(); adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, datas); lv.setAdapter(adapter); /** * 設(shè)置刷新的模式:常用的有三種 * PullToRefreshBase.Mode.BOTH //上下拉刷新都可以 * PullToRefreshBase.Mode.PULL_FROM_START //只允許下拉刷新 * PullToRefreshBase.Mode.PULL_FROM_END //只允許上拉刷新 * */ pullToRefreshListView.setMode(PullToRefreshBase.Mode.BOTH); //設(shè)置是否允許刷新的時候可以滑動 pullToRefreshListView.setScrollingWhileRefreshingEnabled(true); pullToRefreshListView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>() { //完成下拉刷新操作 @Override public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) { new Thread(new Runnable() { @Override public void run() { try { //休眠2s Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } //向集合中添加一個隨機(jī)數(shù) datas.add(0,"item-------"+(int)(Math.random()*100+1)); handler.post(new Runnable() { @Override public void run() { adapter.notifyDataSetChanged(); //控件刷新最新的數(shù)據(jù) pullToRefreshListView.onRefreshComplete(); } }); } }).start(); } //完成上拉刷新操作 @Override public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) { } }); } }
效果圖是這樣的:
可以看到,刷新完成之后隨機(jī)為我們添加了一個條目item--39。這樣刷新就完成了,實際的項目中我們只需要在刷新的監(jiān)聽事件中完成我們的網(wǎng)絡(luò)請求即可。
除了這些,我們還可以定義自己的刷新控件樣式,如下我們首先定義一個全局變量LoadingLayoutProxy對象:
private LoadingLayoutProxy llProxy; //用于設(shè)置刷新控件刷新時的文本等的對象
在適當(dāng)?shù)奈恢脤嵗?,并且設(shè)置相應(yīng)的自定義的值:
layoutProxy = (LoadingLayoutProxy) pullToRefreshListView.getLoadingLayoutProxy(true, false); //下拉的時候顯示的文本 layoutProxy.setPullLabel("很好,繼續(xù)向下拖!"); //可以放開刷新的時候顯示的文本 layoutProxy.setReleaseLabel("放開那只蘿莉,讓我來!"); //執(zhí)行刷新的時候顯示的文本 layoutProxy.setRefreshingLabel("正在刷新喵~"); //設(shè)置加載的圖片 layoutProxy.setLoadingDrawable(getResources().getDrawable(R.drawable.animatorss));
layoutProxy初始化時候的兩個參數(shù),分別表示應(yīng)用于哪里,第一個參數(shù)表示是否應(yīng)用于刷新頭部,第二個參數(shù)表示是否應(yīng)用于尾部。
我們還可以定義刷新時候的聲音:
要使用音頻文件的話需要先在res資源文件下新建一個raw文件夾,把音頻文件放在這里,然后再代碼中引用:
SoundPullEventListener<ListView> soundEvend = new SoundPullEventListener<>(this); //根據(jù)Flag設(shè)置拉出時的聲音 soundEvend.addSoundEvent(PullToRefreshBase.State.PULL_TO_REFRESH, R.raw.pull_event); //拉出的控件回退時的聲音 soundEvend.addSoundEvent(PullToRefreshBase.State.RESET, R.raw.reset_sound); //正在刷新時的聲音 soundEvend.addSoundEvent(PullToRefreshBase.State.REFRESHING, R.raw.refreshing_sound); //為刷新控件綁定我們的設(shè)置 pullToRefreshListView.setOnPullEventListener(soundEvend);
這樣刷新時的聲音也有了,快去試試吧~
對了,在使用PullToRefreshListView的時候遇到過一個問題,就是ListItem的點擊事件每次的position都是需要-1才與當(dāng)前item相對應(yīng),因為下拉刷新的時候相當(dāng)于在ListView的最上方又添加了一個條目,所以設(shè)置其對應(yīng)的點擊事件的時候要注意position-1。
這個是PullToRefresh的library,按照上面說的步驟導(dǎo)入就可以使用了:鏈接:http://pan.baidu.com/s/1cqp9JS 密碼:a12j
這個是PullToRefresh的官方Demo,特別全,感興趣的朋友可以下載下來研究一下:http://pan.baidu.com/s/1ge8gerh
當(dāng)然,這里我們只是簡單的使用PullToRefresh,只是可以實現(xiàn)其刷新功能,更多的定制還需要在研究了~
另外,我覺得這篇寫的入門文章也可以,可以看看http://www.dbjr.com.cn/article/93183.htm
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- android使用PullToRefresh框架實現(xiàn)ListView下拉刷新上拉加載更多
- android使用Ultra-PullToRefresh實現(xiàn)下拉刷新自定義代碼
- android使用PullToRefresh實現(xiàn)下拉刷新和上拉加載
- Android使用PullToRefresh完成ListView下拉刷新和左滑刪除功能
- Android開源項目PullToRefresh下拉刷新功能詳解2
- Android開源項目PullToRefresh下拉刷新功能詳解
- Android使用PullToRefresh實現(xiàn)上拉加載和下拉刷新效果的代碼
- Android實現(xiàn)簡單的下拉刷新pulltorefresh
- Android程序開發(fā)之使用PullToRefresh實現(xiàn)下拉刷新和上拉加載
- Android PullToRefreshLayout下拉刷新控件的終結(jié)者
- Android帶刷新時間顯示的PullToRefresh上下拉刷新
相關(guān)文章
Android 出現(xiàn):java.lang.NoClassDefFoundError...錯誤解決辦法
這篇文章主要介紹了Android 出現(xiàn):Android出現(xiàn):java.lang.NoClassDefFoundError: android/os/PersistableBundle錯誤解決辦法的相關(guān)資料,需要的朋友可以參考下2017-03-03Android開發(fā)之設(shè)置開機(jī)自動啟動的幾種方法
這篇文章主要介紹了Android開發(fā)之設(shè)置開機(jī)自動啟動的幾種方法的相關(guān)資料,這里提供三種方法幫助大家實現(xiàn)這樣的功能,需要的朋友可以參考下2017-08-08android基于socket的局域網(wǎng)內(nèi)服務(wù)器與客戶端加密通信
本篇文章主要介紹了android基于socket的局域網(wǎng)內(nèi)服務(wù)器與客戶端加密通信,這里整理了詳細(xì)的代碼,有需要的小伙伴可以參考下。2017-04-04android 加載本地聯(lián)系人實現(xiàn)方法
在android開發(fā)過程中,有些功能需要訪問本地聯(lián)系人列表,本人搜集整理了一番,拿出來和大家分享一下,希望可以幫助你們2012-12-12淺談Android PathMeasure詳解和應(yīng)用
本篇文章主要介紹了淺談Android PathMeasure詳解和應(yīng)用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01