繼承前面講的兩章,你如今對這第三方自定義控件已經會用了緩存
不過,問題來了,咱們有個需求是打開這軟件的時候,須要自動刷新,而不是咱們手動給他加載數據,怎麼弄呢?就像以下圖網絡
這個具體怎麼實現呢?ide
其實很簡單,只須要把咱們前面第一章的第五步改爲:this
// 設置刷新監聽 pListView.setOnRefreshListener( new OnRefreshListener<ListView>() { @Override public void onRefresh(PullToRefreshBase<ListView> refreshView) { Log.d("PullToRefresh","-------onRefresh被調用-------- ShownHeader="+refreshView.isShownHeader()+" ShownFooter="+refreshView.isShownFooter()); String str = DateUtils.formatDateTime(MainActivity.this, System.currentTimeMillis(), DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_ALL); // 上拉加載更多 業務代碼 if (refreshView.isShownFooter()) { Log.d("refresh", "-----上拉加載----------"); refreshView.getLoadingLayoutProxy().setRefreshingLabel("正在加載"); refreshView.getLoadingLayoutProxy().setPullLabel("上拉加載更多"); refreshView.getLoadingLayoutProxy().setReleaseLabel("釋放開始加載"); refreshView.getLoadingLayoutProxy().setLastUpdatedLabel("最後加載時間:" + str); new MyTask().execute(); }else{ Log.d("refresh", "------下拉刷新---------"); refreshView.getLoadingLayoutProxy().setRefreshingLabel("正在刷新"); refreshView.getLoadingLayoutProxy().setPullLabel("下拉刷新"); refreshView.getLoadingLayoutProxy().setReleaseLabel("釋放開始刷新"); refreshView.getLoadingLayoutProxy().setLastUpdatedLabel("最後更新時間:" + str); new MyTask().execute(); } } }); // 設置自動刷新 pListView.setRefreshing(true);
Ps:主要上面紅色那一句,設置爲自動刷新;spa
Run->咱們發現,效果和咱們效果圖同樣同樣的,很棒。可是咱們看下日誌:日誌
咱們驚奇的發現一個問題了:爲何isShownHeader(),isShownFooter()這標示拉是上拉仍是下拉的標誌都是false呢?code
我從源碼的角度分析下:實際上是因爲拉得時候顯示出來的view和刷新中出來的view不是同一個view。orm
setRefreshing(true)最終會到PullToRefreshListView的OnRefresh()方法中:blog
咱們看到了,它被hide了,因此isShown方法纔會爲false,這下就說得通了,因此咱們就用else來捕捉自動刷新;繼承
再說一個用setRefresh(true)的另外一經常使用問題,不少人設置了,可是發現列表頭部一直顯示在刷新。而且沒有調用onRefresh()方法,這是什麼緣由呢?
是因爲咱們的適配器是空的,裏面沒有任何值,簡單來講,就像把我第一章初始化適配器的方法,不進行對適配器數據集(adapter.add(?))裏面塞數據同樣的。
咱們看下源碼:
在PullToRefreshListView的OnRefresh()方法:
若是適配器爲null,或者裏面沒有數據,就會return這方法,因此形成這結果,那咱們怎麼處理呢?
pulltorefresh的構建思想。刷新,首先你必需要有數據吧,我才能刷新。
而在通常咱們程序開發,都會有緩存機制。首先去讀緩存中得數據,而後再去獲取網絡校驗數據完成刷新界面。也就是在適配器初始化好後,當即讀緩存,都適配器的數據集塞值。最終設置onRefresh(true)完成自動刷新。
固然咱們能夠,把源碼小小改下,就是把我上圖中紅色框裏面的adapter.isEmpty()去掉,這樣就不用必須對初始化好的適配器付完在值才能自動刷新了!
以上即是pulltorefresh的自動刷新內容,謝謝觀看!