Android SwipeRefreshLayout教程

在這篇文章中,我們將介紹SwipeRefreshLayout組件。這個組件被使用時用戶可以使用掃動手勢刷新UI。在以前的文章中,我們談到了另一種方法來刷新,我們叫搖晃刷新界面,在這里用戶搖晃智能手機,使用加速度傳感器的應用程序刷新用戶界面。我們在這篇文章中,主要介紹自定義實現此刷新模式。

SwipeRefreshLayout組件是由SDK提供,已經被用于一些Android自己的應用程序(比如Gmail)的實現。

簡介

SwipeRefreshLayout組件只接受一個子組件:即需要刷新的那個組件。它使用一個偵聽機制來通知擁有該組件的監聽器有刷新事件發生,換句話說我們的Activity必須實現通知的接口。該Activity負責處理事件刷新和刷新相應的視圖。一旦監聽者接收到該事件,就決定了刷新過程中應處理的地方。如果要展示一個“刷新動畫”,它必須調用setRefrshing(true),否則取消動畫就調用setRefreshing(false)

怎樣使用SwipeRefreshLayout

現在我們知道這組件如何工作的,我們將創建一個簡單的例子來說明如何使用。假設用戶通過使用一個垂直滑動手勢來產生一個隨機數:

Android SwipeRefreshLayout教程

通常來說這是根組件:

<android.support.v4.widget.SwipeRefreshLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:android="

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Random number:"
            android:id="@+id/lbl"/>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/rndNum"
            android:layout_toRightOf="@id/lbl"/>


        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@id/lbl"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="20dp"
            android:text="Swipe to Refresh"
            style="@android:style/TextAppearance.Medium"/>



    </RelativeLayout>
</ScrollView>

</android.support.v4.widget.SwipeRefreshLayout></pre>

從上面布局來看,SwipeRefreshLayout只有一個子組件。現在我們來編寫Activity:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final SwipeRefreshLayout swipeView = (SwipeRefreshLayout) findViewById(R.id.swipe);
        final TextView rndNum = (TextView) findViewById(R.id.rndNum);
        swipeView.setColorScheme(android.R.color.holo_blue_dark, android.R.color.holo_blue_light, android.R.color.holo_green_light, android.R.color.holo_green_light);
        swipeView.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                swipeView.setRefreshing(true);
                Log.d("Swipe", "Refreshing Number");
                ( new Handler()).postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        swipeView.setRefreshing(false);
                        double f = Math.random();
                        rndNum.setText(String.valueOf(f));
                    }
                }, 3000);
            }
        });
    }

正如你在示例中所看到的,事件發生在onCreate方法。在第6行,我們得到SwipeRefreshLayout引用,這樣我們就可以設置監聽器(10、11、12行)。在監聽者這邊,我們通過設置setRefreshing(true)動開啟刷新畫,然后生成隨機數。在結束的時候(這里模擬了一個相當漫長的過程)停止動畫。

在ListView上使用SwipeRefreshLayout

另一個有趣的例子是在ListView中如何使用SwipeRefreshLayout。這是一個有趣的例子,因為在真正的應用程序中,我們經常會遇到這種情況。我們有一些帶ListView的項目,希望對它們刷新。如果ListView是SwipeRefreshLayout唯一的孩子,不會出現任何問題,一切都會運行正常。在某些情況下,不僅有ListView可能還有其他的元素。假設有這樣一個界面:

Android SwipeRefreshLayout教程

這種情況有些復雜,如果我們向上滾動在ListView中項目,一切都如預期那樣顯示。但如果向下滾動,刷新過程開始列表項并不滾動。在這種情況下,我們可以使用一個小技巧,可以通過setEnabled(false)禁止使用刷新通知,當Listview中第一個項可見時而再啟用它:

     @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final SwipeRefreshLayout swipeView = (SwipeRefreshLayout) findViewById(R.id.swipe);

    swipeView.setEnabled(false);
    ListView lView = (ListView) findViewById(R.id.list);
    ArrayAdapter adp = new ArrayAdapter(this, android.R.layout.simple_list_item_1, createItems(40,0 ));
    lView.setAdapter(adp);

    swipeView.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
         @Override
         public void onRefresh() {
            swipeView.setRefreshing(true);
             ( new Handler()).postDelayed(new Runnable() {
            @Override
            public void run() {
                swipeView.setRefreshing(false);

            }
        }, 3000);
    }
});

    lView.setOnScrollListener(new AbsListView.OnScrollListener() {
        @Override
         public void onScrollStateChanged(AbsListView absListView, int i) {

    }

        @Override
         public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
            if (firstVisibleItem == 0)
                swipeView.setEnabled(true);
            else
                swipeView.setEnabled(false);
    }
});

}</pre>

正如第33行public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount)看到的,我們重寫了ListView中的onScrollListener去處理啟用/禁用機制。

原文鏈接:
javacodegeeks   翻譯: 伯樂在線 - alice
譯文鏈接: http://blog.jobbole.com/71023/

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!