PullToRefresh初體驗


一、前言:

尊重原創,轉載請註明:From zsml2016(http://blog.csdn.net/qq_29269233)Power byzsml2016侵權必究!


目前刷新控件很多,前幾天做項目時又用到了PullToRefresh,雖然有點舊了,但還好,所以今天我要簡單總結一下PullToRefresh這個開源框架了,我覺得還不錯的,用起來比較簡單方便!


二、PullToRefresh是什麼呢?

PullToRefresh是一套實現非常好的下拉刷新框架,它PullToRefresh是一套實現非常好的下拉刷新庫,如下圖所示它支持:

ListView、ExpandableListView、GridView、WebView、ScrollView、HorizontalScrollView、ViewPager等多種常用的需要刷新的View類型,而且使用起來也十分方便。



三、PullToRefresh庫的下載:

PullToRefresh是github上的開源框架,其地址爲:https://github.com/chrisbanes/Android-PullToRefresh,大家可以去下載jar包和代碼例子;爲了方便,我已經把jar包和sample上傳到CSDN了,所以也可以到我的博客裏下載:http://download.csdn.net/detail/qq_29269233/9703670


四、導入PullToRefresh庫:

把庫下載下來,解壓打開如下圖:



library爲jar包,sample爲案例,當然案例裏面也包含了每個view控件刷新的代碼實現;在此我建議大家直接導入sample,結合代碼案例簡單方便易懂!至於eclipse、studio導入庫的方法都是家常便飯了,在此就不總結了!直接套用實現了,代碼可以參考sample,還可以自己添加一些sample沒有的功能實現。


五、用PullToRefreshListView實現ListView下拉刷新:

1、創建佈局文件activity_ptr_list.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    xmlns:chao="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical">

    <include layout="@layout/titlebar"/>

<!--     The PullToRefreshListView replaces a standard ListView widget. -->

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

        />

</LinearLayout>

2、具體代碼如下:

public final class PullToRefreshListActivity extends ListActivity {


    /**
     * 裝數據
     */
    private LinkedList<String> mListItems;
    private PullToRefreshListView mPullRefreshListView;
    private ArrayAdapter<String> mAdapter;
    private TextView tv_title;

    private String[] mStrings = {"Abbaye de Belloc", "Abbaye du Mont des Cats", "Abertam", "Abondance", "Ackawi",
            "Acorn", "Adelost", "Affidelice au Chablis", "Afuega'l Pitu", "Airag", "Airedale", "Aisy Cendre",
            "Allgauer Emmentaler", "Abbaye de Belloc", "Abbaye du Mont des Cats", "Abertam", "Abondance", "Ackawi",
            "Acorn", "Adelost", "Affidelice au Chablis", "Afuega'l Pitu", "Airag", "Airedale", "Aisy Cendre",
            "Allgauer Emmentaler"};

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_ptr_list);
        tv_title = (TextView) findViewById(R.id.tv_title);
        tv_title.setText("PullToRefreshListView");

        //實例化控件
        mPullRefreshListView = (PullToRefreshListView) findViewById(R.id.pull_refresh_list);

        // Set a listener to be invoked when the list should be refreshed.
        //設置下拉刷新的監聽
//        mPullRefreshListView.setOnRefreshListener(new 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);
//
//                // Update the LastUpdatedLabel
//                //設置更新時間
//                refreshView.getLoadingLayoutProxy().setLastUpdatedLabel(label);
//
//                // Do work to refresh the list here.
//                new GetDataTask().execute();
//            }
//        });

        // Set a listener to be invoked when the list should be refreshed.
        mPullRefreshListView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>() {

            /**
             * 下拉刷新
             * @param refreshView
             */
            @Override
            public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) {
                //得到當前刷新的時間
                String label = DateUtils.formatDateTime(getApplicationContext(), System.currentTimeMillis(),
                        DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_ALL);

                // Update the LastUpdatedLabel
                //設置更新時間
                refreshView.getLoadingLayoutProxy().setLastUpdatedLabel(label);
                Toast.makeText(PullToRefreshListActivity.this, "下拉刷新", Toast.LENGTH_SHORT).show();

                new GetDataTask().execute();
            }

            /**
             * 上拉刷新
             * @param refreshView
             */
            @Override
            public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) {
                //得到當前刷新的時間
                String label = DateUtils.formatDateTime(getApplicationContext(), System.currentTimeMillis(),
                        DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_ALL);

                // Update the LastUpdatedLabel
                //設置更新時間
                refreshView.getLoadingLayoutProxy().setLastUpdatedLabel(label);
                Toast.makeText(PullToRefreshListActivity.this, "上拉刷新!", Toast.LENGTH_SHORT).show();
                new GetDataTask().execute();
            }

        });

        // Add an end-of-list listener
        //設置監聽最後一條
        mPullRefreshListView.setOnLastItemVisibleListener(new OnLastItemVisibleListener() {

            @Override
            public void onLastItemVisible() {
                Toast.makeText(PullToRefreshListActivity.this, "滑動到最後一條了!", Toast.LENGTH_SHORT).show();
            }
        });

        //得到ListView
        ListView listview = mPullRefreshListView.getRefreshableView();


        mListItems = new LinkedList<String>();
        mListItems.addAll(Arrays.asList(mStrings));

        //創建適配器
        mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mListItems);

        /**
         * Add Sound Event Listener
         * 添加刷新事件並且發出聲音
         */
        SoundPullEventListener<ListView> soundListener = new SoundPullEventListener<ListView>(this);
        soundListener.addSoundEvent(State.PULL_TO_REFRESH, R.raw.pull_event);
        soundListener.addSoundEvent(State.RESET, R.raw.reset_sound);
        soundListener.addSoundEvent(State.REFRESHING, R.raw.refreshing_sound);
        mPullRefreshListView.setOnPullEventListener(soundListener);

        // You can also just use setListAdapter(mAdapter) or
        // mPullRefreshListView.setAdapter(mAdapter)
        //設置適配器
        listview.setAdapter(mAdapter);


        //設置上拉刷新或者下拉刷新
//        mPullRefreshListView.setMode(PullToRefreshBase.Mode.PULL_FROM_END);
//        mPullRefreshListView.setMode(PullToRefreshBase.Mode.PULL_FROM_START);
    }

    private class GetDataTask extends AsyncTask<Void, Void, String[]> {

        @Override
        protected String[] doInBackground(Void... params) {
            // Simulates a background job.
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
            }
            return mStrings;
        }

        @Override
        protected void onPostExecute(String[] result) {
            if(mPullRefreshListView.getMode()== PullToRefreshBase.Mode.PULL_FROM_START){
                //下拉刷新
                mListItems.addFirst("刷新請求到的新數據...");
            }else if(mPullRefreshListView.getMode()==PullToRefreshBase.Mode.PULL_FROM_END){
                mListItems.addLast("上拉數據請求到了...");
            }

            mAdapter.notifyDataSetChanged();

            // Call onRefreshComplete when the list has been refreshed.
            mPullRefreshListView.onRefreshComplete();

            super.onPostExecute(result);
        }
    }



}

3、是不是很簡單呀,運行效果如下:



六、WebView實現下拉刷新

1、創建佈局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <include layout="@layout/titlebar"/>

<!--     The PullToRefreshWebView replaces a standard WebView widget. -->

    <com.handmark.pulltorefresh.library.PullToRefreshWebView
        xmlns:ptr="http://schemas.android.com/apk/res-auto"
        android:id="@+id/pull_refresh_webview"
        android:layout_height="fill_parent"
        android:layout_width="fill_parent"
        ptr:ptrMode="both" />

</LinearLayout>

2、具體代碼實現:

public final class PullToRefreshWebViewActivity extends Activity {

   PullToRefreshWebView mPullRefreshWebView;
   WebView mWebView;
   private TextView tv_title;

   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_ptr_webview);

      mPullRefreshWebView = (PullToRefreshWebView) findViewById(R.id.pull_refresh_webview);
      mWebView = mPullRefreshWebView.getRefreshableView();

      tv_title = (TextView) findViewById(R.id.tv_title);
      tv_title.setText("PullToRefreshWebView");

      mWebView.getSettings().setJavaScriptEnabled(true);
      //設置WebViewClient
      mWebView.setWebViewClient(new SampleWebViewClient());
      mWebView.loadUrl("http://blog.csdn.net/qq_29269233");

   }

   private static class SampleWebViewClient extends WebViewClient {
//    @Override
//    public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
//       view.loadUrl(request.getUrl().toString());
//       return true;
//    }

      @Override
      public boolean shouldOverrideUrlLoading(WebView view, String url) {
         view.loadUrl(url);
         return true;
      }
   }

}

3、一個簡單的瀏覽器很容易地實現了,而且還支持下拉刷新,上拉加載,我覺得挺方便簡潔的,好吧效果如下:



至此,我已經總結了listview和webview的簡單快速地集成下拉刷新了,至於其他view控件的刷新也是大同小異了,希望大家能夠參照sample的例子,自己嘗試去使用,相信你們也可以的,Come,on !


更多精彩內容請關注我的博客:luoweichao.top



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