Android下拉重新整理控制項PullToRefresh執行個體解析_Android

來源:互聯網
上載者:User

  Android中很多時候都會用到上下拉重新整理,這是一個很常用的功能,Android的v4包中也為我們提供了一種原生的下拉重新整理控制項--SwipeRefreshLayout,可以用它實現一個簡潔的重新整理效果,但今天我們的主角並不是它,而是一個很火的第三方的上下拉重新整理控制項--PullToRefresh。PullToRefresh包括PullToRefreshScrollView、PullToRefreshListView、PullToRefreshGridView等等很多為我們提供的控制項,我們可以在xml檔案中直接引入作為控制項使用。

與一些其他的第三方庫不同,PullToRefresh的使用需要我們引用一個module作為依賴:

之後進入我們的project的配置中心,快速鍵是ctrl+alt+shift+s,然後選中你想要添加上下拉重新整理的module,點擊右上方的加號,選擇Module dependency

然後一路點擊"OK",等待一會就可以將這個類庫附加到我們項目中了,我們就可以使用上下拉重新整理了。

我們引入的第三方庫的目錄結構是這樣的:

在xml檔案中使用該控制項的時候,注意要使用包名.類名的形式來引用你想要使用的控制項,像這樣:

com.handmark.pulltorefresh.library.PullToRefreshListView

包名可以在我們引入的庫的module的AndroidManifest中查看,在目錄中的java檔案夾下的類就是我們要使用的類。這裡我們以PullToRefreshListView為例,其他的控制項的使用方法類似。非常噁心的是控制項裡面的屬性沒有代碼提示...沒有代碼提示...沒有代碼提示!害的我對照了好幾遍,以為自己倒錯了module,結果是因為沒有代碼提示。
我們先來看幾個比較重要的方法: 

//擷取帶有重新整理的對應控制項 pullToRefreshListView.getRefreshableView(); /** * 設定重新整理的模式:常用的有三種 * PullToRefreshBase.Mode.BOTH //上下拉重新整理都可以 * PullToRefreshBase.Mode.PULL_FROM_START //只允許下拉重新整理 * PullToRefreshBase.Mode.PULL_FROM_END //只允許上拉重新整理 * */ pullToRefreshListView.setMode(PullToRefreshBase.Mode.PULL_FROM_END); //設定是否允許重新整理的時候可以滑動 pullToRefreshListView.setScrollingWhileRefreshingEnabled(true);

當我們通過getRefreshableView()獲得對應的帶有重新整理的控制項(如使用PullToRefreshListView的時候,調用此方法會返回一個ListView執行個體)的時候會得到一個對應的控制項,比如說ListView,則listItem的點擊事件或者是資料適配我們就可以對這個擷取到的ListView進行。

還有一個比較重要的方法就是為控制項設定重新整理時的監聽: 
pullToRefreshListView.setOnRefreshListener()

他有兩個參數可以傳,一個是
PullToRefreshBase.OnRefreshListener<T>

介面對應的匿名內部類形式。一個是
PullToRefreshBase.OnRefreshListener2<T>

介面對應的匿名內部類形式。其中一般上下拉重新整理同時可用的時候我們選擇第二個形式: 

pullToRefreshListView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>() { //完成下拉重新整理操作 @Override public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) { } //完成上拉重新整理操作 @Override public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) { } });

當然,PullToRefresh還有一個重要方法就是 
pullToRefreshListView.onRefreshComplete();

此方法用來通知重新整理完成了,取消重新整理動畫,如果不加這一句,會一直顯示一個重新整理動畫。這裡我們類比一些資料,並且在下拉重新整理的時候使用線程讓程式睡2s,然後再隨機載入一條新資料並通知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;//設定重新整理時的文本等的對象 @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); } //擷取帶有重新整理的對應控制項 lv = pullToRefreshListView.getRefreshableView(); adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, datas); lv.setAdapter(adapter); /** * 設定重新整理的模式:常用的有三種 * PullToRefreshBase.Mode.BOTH //上下拉重新整理都可以 * PullToRefreshBase.Mode.PULL_FROM_START //只允許下拉重新整理 * PullToRefreshBase.Mode.PULL_FROM_END //只允許上拉重新整理 * */ pullToRefreshListView.setMode(PullToRefreshBase.Mode.BOTH); //設定是否允許重新整理的時候可以滑動 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();  }  //向集合中添加一個隨機數  datas.add(0,"item-------"+(int)(Math.random()*100+1));  handler.post(new Runnable() {  @Override  public void run() {  adapter.notifyDataSetChanged();  //控制項重新整理最新的資料  pullToRefreshListView.onRefreshComplete();  }  });  } }).start(); } //完成上拉重新整理操作 @Override public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) { } }); }}

效果圖是這樣的: 

可以看到,重新整理完成之後隨機為我們添加了一個條目item--39。這樣重新整理就完成了,實際的項目中我們只需要在重新整理的監聽事件中完成我們的網路請求即可。 

除了這些,我們還可以定義自己的重新整理控制項樣式,如下我們首先定義一個全域變數LoadingLayoutProxy對象: 
private LoadingLayoutProxy llProxy;  //用於設定重新整理控制項重新整理時的文本等的對象

在適當的位置執行個體化,並且設定相應的自訂的值: 

layoutProxy = (LoadingLayoutProxy) pullToRefreshListView.getLoadingLayoutProxy(true, false); //下拉的時候顯示的文本 layoutProxy.setPullLabel("很好,繼續向下拖!"); //可以放開重新整理的時候顯示的文本 layoutProxy.setReleaseLabel("放開那隻蘿莉,讓我來!"); //執行重新整理的時候顯示的文本 layoutProxy.setRefreshingLabel("正在重新整理喵~"); //設定載入的圖片 layoutProxy.setLoadingDrawable(getResources().getDrawable(R.drawable.animatorss));

layoutProxy初始化時候的兩個參數,分別表示應用於哪裡,第一個參數表示是否應用於重新整理頭部,第二個參數表示是否應用於尾部。 

我們還可以定義重新整理時候的聲音: 

要使用音頻檔案的話需要先在res資源檔下建立一個raw檔案夾,把音頻檔案放在這裡,然後再代碼中引用: 

SoundPullEventListener<ListView> soundEvend = new SoundPullEventListener<>(this); //根據Flag設定拉出時的聲音 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); //為重新整理控制項綁定我們的設定 pullToRefreshListView.setOnPullEventListener(soundEvend);

這樣重新整理時的聲音也有了,快去試試吧~

對了,在使用PullToRefreshListView的時候遇到過一個問題,就是ListItem的點擊事件每次的position都是需要-1才與當前item相對應,因為下拉重新整理的時候相當於在ListView的最上方又添加了一個條目,所以設定其對應的點擊事件的時候要注意position-1。

這個是PullToRefresh的library,按照上面說的步驟匯入就可以使用了:連結:http://pan.baidu.com/s/1cqp9JS 密碼:a12j
這個是PullToRefresh的官方Demo,特別全,感興趣的朋友可以下載下來研究一下:http://pan.baidu.com/s/1ge8gerh 

當然,這裡我們只是簡單的使用PullToRefresh,只是可以實現其重新整理功能,更多的定製還需要在研究了~ 

另外,我覺得這篇寫的入門文章也可以,可以看看http://www.jb51.net/article/93183.htm

以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援雲棲社區。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.