Android開發中pullToRefresh使用技巧

Android開發中pullToRefresh使用技巧。

PullToRefresh的導入

首先,點擊new按鈕 -> import Module

然後在 New Module界面選擇已經在本地的含有源代碼的pullToRefresh。

打開如下圖所示的open Module Settings 按鈕

點擊app中的Dependencies 中右邊框的"+"按鈕,選擇第三個 ,如下所示

選擇Modules : pullToRefreshLibrary ,點擊OK
然後在build.gradle(Module:app)或者你自己要寫的那個android 程序的根文件夾的build.gradle中加入下面一句話

compile project(':pullToRefreshLibrary')

自此,pullToRefresh已經導入成功,可以新建一個pullToRefrenshListView驗證一下。

pullToRefreshListView的基本使用

pullToRefreshListView和ListView的使用基本差的不多,隻不過ListView的xml要換成com.handmark.pulltorefresh.library.PullToRefreshListView
例子如下:




    

    

上面的例子中pullToRefreshListView中多瞭幾個屬性 分別以ptr開頭,這是指定pullToRefreshListView在刷新的時候出現的特效,比如第一個是指定刷新時顯示的圖片,第二個是指定刷新的圖片以何種方式顯示出來,第三個是指定刷新時頭部的背景,第四個是指定刷新時頭部字體的顏色。

以上這些都可以在代碼中設置。

ListView中每個item的xml還是不變的,adapter的使用和寫法也是不變的,需要改變的隻有設定刷新事件。

接下來在代碼中設定pullToRefreshListView的一些基本屬性和事件。

步驟一 綁定控件,設置屬性

綁定控件代碼如下:

private PullToRefreshListView listview;
listview = (PullToRefreshListView) findViewById(R.id.refresh_list_view);

設置刷新時顯示的刷新狀態

//對pullToListView綁定adapter
listview.setAdapter(adapter);
 /*設置pullToRefreshListView的刷新模式,BOTH代表支持上拉和下拉,PULL_FROM_END代表上拉,PULL_FROM_START代表下拉 */  
listview.setMode(PullToRefreshBase.Mode.BOTH);
initRefreshListView();

initRefreshListView方法設置刷新顯示的狀態

這裡通過getLoadingLayoutProxy方法來指定上拉和下拉時顯示的狀態的區別,第一個true 代表下來狀態 ,第二個true 代表上拉的狀態 。如果想區分上拉和下拉狀態的不同,可以分別設置getLoadingLayoutProxy,例子如下:

public void initRefreshListView(){    
    ILoadingLayout startLabels = pullToRefresh    
                .getLoadingLayoutProxy(true, false);    
    startLabels.setPullLabel("下拉刷新");    
    startLabels.setRefreshingLabel("正在刷新");   
    startLabels.setReleaseLabel("放開刷新");    
    ILoadingLayout endLabels = pullToRefresh.getLoadingLayoutProxy(    
                false, true);    
    endLabels.setPullLabel("上拉刷新");    
    endLabels.setRefreshingLabel("正在載入...");  
    endLabels.setReleaseLabel("放開刷新...");}

這樣pullToRefreshListView刷新時狀態就設定好瞭。

步驟二 pullToRefreshListView監聽事件的設置

這裡主要設置setOnRefreshListener事件,根據剛才設置的不同的刷新模式,在裡面寫的匿名內部類也不一樣。
規則如下:

如果Mode設置成Mode.BOTH,需要設置刷新Listener為OnRefreshListener2,並實現onPullDownToRefresh()、onPullUpToRefresh()兩個方法。  
如果Mode設置成Mode.PULL_FROM_START或Mode.PULL_FROM_END,需要設置刷新Listener為OnRefreshListener,同時實現onRefresh()方法。 
當然也可以設置為OnRefreshListener2,但是Mode.PULL_FROM_START的時候隻調用onPullDownToRefresh()方法, 
Mode.PULL_FROM_END的時候隻調用onPullUpToRefresh()方法.

這樣在進入該Activity時候,手動上拉和下拉就會實現刷新和加載。
如果想剛進入Activity的時候就執行加載,則要調用如下方法

listview.setRefreshing();

接下來隻需要在onPullDownToRefresh和onPullUpToRefresh編寫要獲取listview新數據的方法。
我這裡的例子如下:

listview.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2() {
     @Override
     public void onPullDownToRefresh(PullToRefreshBase refreshView) {
            adapter.addToTop();
            new FinishRefresh().execute();
}

     @Override
     public void onPullUpToRefresh(PullToRefreshBase refreshView) {
            adapter.addToBottom();
            new FinishRefresh().execute();
}
});

我這裡在自定義的adapter中寫瞭2個新方法addToTop和addToBottom分別在頭部加入數據和在尾部加入數據
方法如下:

 private void addToTop() {
    for (int i = 0; i < 2; i++) {
          Item item = new Item();
          item.setText("在頭部加入第" + i + "數據");
          item.setImageid(R.mipmap.ic_launcher);
          listItems.add(i, item);
    }
}
private void addToBottom() {
    for (int i = 0; i < 2; i++) {
          Item item = new Item();
          item.setText("在尾部加入第" + i + "數據");
          item.setImageid(R.mipmap.ic_launcher);
          listItems.add(item);
     }
}

這裡並沒有考慮去重的問題,就是每次刷新結束後會顯示出刷新的結果,當再次刷新後,又會執行和上次一樣的結果,實際上,這是不符合邏輯的,當第二次在刷新的時候應該進行判斷,如果數據一樣就不把數據加入到list當中。

接下來new FinishRefresh().execute();是這裡我比較疑惑的一個固定寫法,在這個com.handmark.pulltorefresh.library.PullToRefreshListView框架下,執行onRefreshComplete();方法必須在異步下執行,不能和主進程一起執行,如果直接在下拉,上拉監聽方法中寫入onRefreshComplete();則在實際刷新中刷新狀態的顯示header是不會收回去的,換句話說 刷新一直不會完成。

所以要在繼承AsyncTask的類下調用onRefreshComplete();

private class FinishRefresh extends AsyncTask {
        @Override
        protected Void doInBackground(Void... params) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {

            }
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            listview.onRefreshComplete();
            adapter.notifyDataSetChanged();
        }
    }

至此,pullToRefreshListview就實現瞭簡單的上拉,下拉使用。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *