Android PullToRefresh 實戰(ListView)

今天帶來最火的下拉刷新,上拉加載控件實戰: Android PullToRefresh

github地址:https://github.com/chrisbanes/Android-PullToRefresh

因爲git上面下載的項目是在eclipes中編譯的,那麼我們首先解決將library包導入Android Studio的問題。

首先將下載的library包導入eclipes中,然後Export ,選擇Build方式,下一步完成build的創建,這樣在library的源文件目錄下就會生成一個build.gradle文件,之後我們就可以使用Android studio將library文件當作Model導入我們的工程裏面,如圖:
這裏寫圖片描述

ok,接下來我們先來看listview的使用。

第一種:只有下拉刷新,不支持上拉加載更多

activity_main.xml佈局文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <com.handmark.pulltorefresh.library.PullToRefreshListView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/pull_refresh_list"
        android:divider="#19000000"
        android:dividerHeight="4dp"
        android:fadingEdge="none"
        android:fastScrollEnabled="false"
        android:footerDividersEnabled="false"
        android:headerDividersEnabled="false"
        android:smoothScrollbar="true"
        />

</RelativeLayout>

所有屬性都是listView自帶的屬性,如果有屬性不是很清楚的,大家可以自行Google一把。

MainActivity中

public class MainActivity extends AppCompatActivity {

    private PullToRefreshListView mListView;
    private ArrayAdapter<String> mAdapter;
    private LinkedList<String> mDatas;

    private int mItemCount = 9;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //初始化數據
        initDatas();
        //初始化視圖
        initView();
        //初始化事件
        initEvent();
    }

    /**
     * 初始化事件
     */
    private void initEvent() {
        **mListView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener<ListView>()** {
            @Override
            public void onRefresh(PullToRefreshBase<ListView> refreshView) {
                String label = DateUtils.formatDateTime(
                        getApplicationContext(),
                        System.currentTimeMillis(),
                        DateUtils.FORMAT_SHOW_TIME
                                | DateUtils.FORMAT_SHOW_DATE
                                | DateUtils.FORMAT_ABBREV_ALL);
                refreshView.getLoadingLayoutProxy().setLastUpdatedLabel(label);

                //模擬加載數據
                new GetDataTask().execute();
            }
        });
    }

    /**
     * 初始化視圖
     */
    private void initView() {
        mListView= (PullToRefreshListView) findViewById(R.id.pull_refresh_list);
        mAdapter=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,mDatas);

        mListView.setAdapter(mAdapter);
    }

    /**
     * 初始化數據方法
     */
    private void initDatas() {
        mDatas=new LinkedList<>();
        for (int i = 0; i < mItemCount; i++)
        {
            mDatas.add("" + i);
        }
    }

    /**
     * 模擬異步加載數據
     */
    public class GetDataTask extends AsyncTask<Void,Void,String>{

        @Override
        protected String doInBackground(Void... params) {
            try
            {
                Thread.sleep(2000);
            } catch (InterruptedException e)
            {
            }
            return "" + (mItemCount++);
        }

        @Override
        protected void onPostExecute(String s) {
            //將doInBackground返回的String字符串加入數據源
            mDatas.add(s);
            //listView適配器修改數據展示
            mAdapter.notifyDataSetChanged();
            //pull-to-refresh ListView 完成刷新
            mListView.onRefreshComplete();
        }
    }

}

註釋很清楚,注意綁定以上監聽,只能實現下拉刷新功能。簡單看下效果:

![這裏寫代碼片](https://img-blog.csdn.net/20150713144551488)

添加上拉加載更多
如過希望實現上拉加載更多,那麼首先需要在佈局文件的聲明屬性中添加一個屬性,用於指定目前的下拉模式:

<com.handmark.pulltorefresh.library.PullToRefreshListView
        xmlns:ptr="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/pull_refresh_list"
        android:divider="#19000000"
        android:dividerHeight="4dp"
        android:fadingEdge="none"
        android:fastScrollEnabled="false"
        android:footerDividersEnabled="false"
        android:headerDividersEnabled="false"
        android:smoothScrollbar="true"
        ptr:ptrMode="both"
        ptr:ptrAnimationStyle="rotate"/>

我們添加了一個屬性:ptr:ptrMode=”both” ,意思:上拉和下拉都支持。
可選值爲:disabled(禁用下拉刷新),pullFromStart(僅支持下拉刷新),pullFromEnd(僅支持上拉刷新),both(二者都支持),manualOnly(只允許手動觸發)

MainActivity中跟上面的區別只有一個地方:

mListView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>() {
            @Override
            public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) {
                Log.e("WJ", "onPullDownToRefresh");
                //這裏寫下拉刷新的任務
                new GetDataTask().execute();
            }

            @Override
            public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) {
                Log.e("WJ", "onPullUpToRefresh");
                //這裏寫上拉加載更多的任務
                new GetDataTask().execute();
            }
        });

mPullRefreshListView.setOnRefreshListener(new OnRefreshListener2(){});注意這裏的接口類型是OnRefreshListener2,多了個2,和上面的不一樣,這個接口包含兩個方法,一個上拉回調,一個下拉回調。好了,這樣我們就成功添加了上拉與下拉,並且分別可以控制其回調代碼。

效果:

這裏寫圖片描述

接下來,我們改變下上下拉刷新時候的旋轉圖標

1.框架自身給我們實現了箭頭的效果

<com.handmark.pulltorefresh.library.PullToRefreshListView
        xmlns:ptr="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/pull_refresh_list"
        android:divider="#19000000"
        android:dividerHeight="4dp"
        android:fadingEdge="none"
        android:fastScrollEnabled="false"
        android:footerDividersEnabled="false"
        android:headerDividersEnabled="false"
        android:smoothScrollbar="true"
        ptr:ptrMode="both"
        ptr:ptrAnimationStyle="flip"
        />

可以看到最後一行跟我們之前的設置有不同:
ptr:ptrAnimationStyle的取值:flip(翻轉動畫), rotate(旋轉動畫) 。

2.使用本地圖片作爲該圖標
這裏寫圖片描述

很簡單,只要一行代碼就Ok

ptr:ptrAnimationStyle="rotate"

自定義下拉指示器文本內容等效果

ok,接下來看這樣一個效果的實現

這裏寫圖片描述

可以看到我們分別設置了上下拉刷新時候顯示的文本內容,只需要加上如下方法就可以:

 private void initIndicator()
    {
        ILoadingLayout startLabels = mListView
                .getLoadingLayoutProxy(true, false);
        startLabels.setPullLabel("你可勁拉,拉...");// 剛下拉時,顯示的提示
        startLabels.setRefreshingLabel("好嘞,正在刷新...");// 刷新時
        startLabels.setReleaseLabel("你敢放,我就敢刷新...");// 下來達到一定距離時,顯示的提示

        ILoadingLayout endLabels = mListView.getLoadingLayoutProxy(
                false, true);
        endLabels.setPullLabel("你可勁拉,拉2...");// 剛下拉時,顯示的提示
        endLabels.setRefreshingLabel("好嘞,正在刷新2...");// 刷新時
        endLabels.setReleaseLabel("你敢放,我就敢刷新2...");// 下來達到一定距離時,顯示的提示
    }

在mListView.setOnRefreshListener之前調用該方法即可!

以上步驟,我們可以初步瞭解pullToRefresh框架的使用。但從一開始我就有個疑問,不知道你們有沒有這個同樣的疑惑,在上拉加載更多的時候,如果屏幕數據還沒有佔滿全屏,我們沒必要讓屏幕支持上拉加載更多啊,請教了大神,然後解決了這個疑惑:
在做上拉加載更多的時候,我們一定會設置一個頁面允許加載的最大值,如果我們list裏面的數據

 @Override
        protected void onPostExecute(String s) {

            if(mItemCount++>15){
                mListView.setMode(PullToRefreshBase.Mode.BOTH);
            }else{
                mListView.setMode(PullToRefreshBase.Mode.PULL_FROM_START);
            }

            //將doInBackground返回的String字符串加入數據源
            mDatas.add(s);
            //listView適配器修改數據展示
            mAdapter.notifyDataSetChanged();
            //pull-to-refresh ListView 完成刷新
            mListView.onRefreshComplete();
        }

具體就是,在數據加載成功,執行onPostExecute(String str)方法的時候判斷下就ok,上面的15就是我們設置的頁面最大數量。

最後,總結下其他常用的
ptrRefreshableViewBackground 設置整個mPullRefreshListView的背景色
ptrHeaderBackground 設置下拉Header或者上拉Footer的背景色
ptrHeaderTextColor 用於設置Header與Footer中文本的顏色
ptrHeaderSubTextColor 用於設置Header與Footer中上次刷新時間的顏色
ptrShowIndicator如果爲true會在mPullRefreshListView中出現icon,右上角和右下角,挺有意思的。
ptrHeaderTextAppearance , ptrSubHeaderTextAppearance分別設置拉Header或者上拉Footer中字體的類型顏色等等。

ptrScrollingWhileRefreshingEnabled刷新的時候,是否允許ListView或GridView滾動。覺得爲true比較好。

ptrListViewExtrasEnabled 決定了Header,Footer以何種方式加入mPullRefreshListView,true爲headView方式加入,就是滾動時刷新頭部會一起滾動。

最後2個其實對於用戶體驗還是挺重要的,如果設置的時候考慮下~。其他的屬性自己選擇就好。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章