pulltorefresh(三)自動刷新

繼承前面講的兩章,你如今對這第三方自定義控件已經會用了緩存

不過,問題來了,咱們有個需求是打開這軟件的時候,須要自動刷新,而不是咱們手動給他加載數據,怎麼弄呢?就像以下圖網絡

這個具體怎麼實現呢?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的自動刷新內容,謝謝觀看!

相關文章
相關標籤/搜索