PullToRefresh下拉重新整理的簡單使用
Android中很多時候都會用到上下拉重新整理,這是一個很常用的功能,Android的v4包中也為我們提供了一種原生的下拉重新整理控制元件--SwipeRefreshLayout,可以用它實現一個簡潔的重新整理效果,但今天我們的主角並不是它,而是一個很火的第三方的上下拉重新整理控制元件--PullToRefresh。PullToRefresh包括PullToRefreshScrollView、PullToRefreshListView、PullToRefreshGridView等等很多為我們提供的控制元件,我們可以在xml檔案中直接引入作為控制元件使用。
與一些其他的第三方庫不同,PullToRefresh的使用需要我們引用一個module作為依賴:
之後進入我們的project的配置中心,快捷鍵是ctrl+alt+shift+s,然後選中你想要新增上下拉重新整理的module,點選右上角的加號,選擇Module dependency:
然後一路點選"OK",等待一會就可以將這個類庫附加到我們專案中了,我們就可以使用上下拉重新整理了。
我們引入的第三方庫的目錄結構是這樣的:
在xml檔案中使用該控制元件的時候,注意要使用包名.類名的形式來引用你想要使用的控制元件,像這樣:
1 com.handmark.pulltorefresh.library.PullToRefreshListView
包名可以在我們引入的庫的module的AndroidManifest中檢視,在目錄中的java資料夾下的類就是我們要使用的類。這裡我們以PullToRefreshListView為例,其他的控制元件的使用方法類似。非常噁心的是控制元件裡面的屬性沒有程式碼提示...沒有程式碼提示...沒有程式碼提示!害的我對照了好幾遍,以為自己倒錯了module,結果是因為沒有程式碼提示。
我們先來看幾個比較重要的方法:
1 //獲取帶有重新整理的對應控制元件 2 pullToRefreshListView.getRefreshableView(); 3 /** 4 * 設定重新整理的模式:常用的有三種 5 * PullToRefreshBase.Mode.BOTH //上下拉重新整理都可以 6 * PullToRefreshBase.Mode.PULL_FROM_START //只允許下拉重新整理 7 * PullToRefreshBase.Mode.PULL_FROM_END //只允許上拉重新整理 8 * 9 */ 10 pullToRefreshListView.setMode(PullToRefreshBase.Mode.PULL_FROM_END); 11 //設定是否允許重新整理的時候可以滑動 12 pullToRefreshListView.setScrollingWhileRefreshingEnabled(true);
當我們通過getRefreshableView()獲得對應的帶有重新整理的控制元件(如使用PullToRefreshListView的時候,呼叫此方法會返回一個ListView例項)的時候會得到一個對應的控制元件,比如說ListView,則listItem的點選事件或者是資料適配我們就可以對這個獲取到的ListView進行。
還有一個比較重要的方法就是為控制元件設定重新整理時的監聽:
1 pullToRefreshListView.setOnRefreshListener()
他有兩個引數可以傳,一個是
1 PullToRefreshBase.OnRefreshListener<T>
介面對應的匿名內部類形式。一個是
1 PullToRefreshBase.OnRefreshListener2<T>
介面對應的匿名內部類形式。其中一般上下拉重新整理同時可用的時候我們選擇第二個形式:
1 pullToRefreshListView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>() { 2 //完成下拉重新整理操作 3 @Override 4 public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) { 5 6 } 7 8 //完成上拉重新整理操作 9 @Override 10 public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) { 11 12 } 13 });
當然,PullToRefresh還有一個重要方法就是
1 pullToRefreshListView.onRefreshComplete();
此方法用來通知重新整理完成了,取消重新整理動畫,如果不加這一句,會一直顯示一個重新整理動畫。這裡我們模擬一些資料,並且在下拉重新整理的時候使用執行緒讓程式睡2s,然後再隨機載入一條新資料並通知Adapter更新UI,完成程式碼如下:
1 package ggcomic.rabbit.lx.pulltorefresh; 2 3 import android.os.Handler; 4 import android.support.v7.app.AppCompatActivity; 5 import android.os.Bundle; 6 import android.widget.ArrayAdapter; 7 import android.widget.ListView; 8 9 import com.handmark.pulltorefresh.library.LoadingLayoutProxy; 10 import com.handmark.pulltorefresh.library.PullToRefreshBase; 11 import com.handmark.pulltorefresh.library.PullToRefreshListView; 12 13 import java.util.ArrayList; 14 import java.util.List; 15 16 public class MainActivity extends AppCompatActivity { 17 18 private PullToRefreshListView pullToRefreshListView; 19 private ListView lv; 20 private List<String> datas; 21 private ArrayAdapter<String> adapter; 22 private Handler handler=new Handler(); 23 private LoadingLayoutProxy llProxy;//設定重新整理時的文字等的物件 24 25 @Override 26 27 protected void onCreate(Bundle savedInstanceState) { 28 super.onCreate(savedInstanceState); 29 setContentView(R.layout.activity_main); 30 31 pullToRefreshListView = (PullToRefreshListView) findViewById(R.id.pull); 32 33 datas=new ArrayList<>(); 34 for(int i=1;i<=50;i++){ 35 datas.add("item---------"+i); 36 } 37 38 //獲取帶有重新整理的對應控制元件 39 lv = pullToRefreshListView.getRefreshableView(); 40 adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, datas); 41 lv.setAdapter(adapter); 42 /** 43 * 設定重新整理的模式:常用的有三種 44 * PullToRefreshBase.Mode.BOTH //上下拉重新整理都可以 45 * PullToRefreshBase.Mode.PULL_FROM_START //只允許下拉重新整理 46 * PullToRefreshBase.Mode.PULL_FROM_END //只允許上拉重新整理 47 * 48 */ 49 pullToRefreshListView.setMode(PullToRefreshBase.Mode.BOTH); 50 //設定是否允許重新整理的時候可以滑動 51 pullToRefreshListView.setScrollingWhileRefreshingEnabled(true); 52 53 pullToRefreshListView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>() { 54 //完成下拉重新整理操作 55 @Override 56 public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) { 57 new Thread(new Runnable() { 58 @Override 59 public void run() { 60 try { 61 //休眠2s 62 Thread.sleep(2000); 63 } catch (InterruptedException e) { 64 e.printStackTrace(); 65 } 66 67 //向集合中新增一個隨機數 68 datas.add(0,"item-------"+(int)(Math.random()*100+1)); 69 handler.post(new Runnable() { 70 @Override 71 public void run() { 72 adapter.notifyDataSetChanged(); 73 //控制元件重新整理最新的資料 74 pullToRefreshListView.onRefreshComplete(); 75 } 76 }); 77 } 78 }).start(); 79 } 80 81 //完成上拉重新整理操作 82 @Override 83 public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) { 84 85 } 86 }); 87 88 } 89 }
效果圖是這樣的:
可以看到,重新整理完成之後隨機為我們添加了一個條目item--39。這樣重新整理就完成了,實際的專案中我們只需要在重新整理的監聽事件中完成我們的網路請求即可。