「スワイプで更新」機能をアプリに追加する

「スワイプで更新」ユーザー インターフェース パターンは、SwipeRefreshLayout ウィジェット内にすべて実装されています。このウィジェットは、垂直方向のスワイプを検出して、専用の進行状況バーを表示し、アプリ内のコールバック メソッドをトリガーします。この動作を有効にするには、このウィジェットを ListView または GridView の親としてレイアウト ファイルに追加し、ユーザーがスワイプしたときに呼び出される更新動作を実装します。

このレッスンでは、ウィジェットを既存のレイアウトに追加する方法について説明します。また、アクションバーのオーバーフロー領域に更新アクションを追加する方法についても説明します。更新アクションを追加することにより、スワイプ ジェスチャーを実行できないユーザーも、外部デバイスを使用して手動更新をトリガーできるようになります。

SwipeRefreshLayout ウィジェットを追加する

「スワイプで更新」ウィジェットを既存のアプリに追加するには、SwipeRefreshLayout を単一の ListView または GridView の親として追加します。SwipeRefreshLayout がサポートするのは、単一の子(ListView または GridView)に限られます。

例として、ListView を格納する既存のレイアウト ファイルに SwipeRefreshLayout ウィジェットを追加する方法を以下に示します。

<android.support.v4.widget.SwipeRefreshLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/swiperefresh"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <ListView
            android:id="@android:id/list"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

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

なお、ListFragment でも SwipeRefreshLayout ウィジェットを使用することができます。ID が "@android:id/list"ListView がレイアウトに格納されている場合、「スワイプで更新」機能は自動的にサポートされます。ただし、上記のように ListView を明示的に宣言することで、デフォルト ListFragment ビュー構造よりも優先されるようになります。デフォルト ビュー構造を使用する場合は、SwipeRefreshLayout および ListFragment の動作の部分をオーバーライドする必要があります。

更新アクションをアクションバーに追加する

アプリのアクションバーに更新アクションを追加して、スワイプ ジェスチャーを実行できないユーザーでも手動更新をトリガーできるようにしてください。たとえば、ユーザー補助機能が必要なユーザーは、キーボードや十字キーなどの外部デバイスを使用することで、アクションバーのアクションをトリガーできます。

更新アクションは、android:showAsAction=never 属性を設定して、ボタンではなくメニュー項目として追加するようにしてください。このアクションをボタンとして表示した場合、更新ボタン アクションと「スワイプで更新」アクションを別のものだとユーザーが認識するおそれがあります。更新アクションをアクションバー内であまり目立たないように配置することで、スワイプ ジェスチャーによる手動更新をユーザーにすすめつつ、十字キーを使用するユーザーが通常探す場所にも、利用しやすいオプションを提供することができます。

「スワイプで更新」アクションをオーバーフロー領域に追加する方法を次のコードに示します。

<menu xmlns:android="http://schemas.android.com/apk/res/android" >
        <item
            android:id="@+id/menu_refresh"
            android:showAsAction="never"
            android:title="@string/menu_refresh"/>
    </menu>