更新リクエストに応答する

このドキュメントでは、ユーザーが手動更新をリクエストしたとき(スワイプ操作によるトリガー、アクションバーの更新アクションの使用など)でアプリを更新する方法について説明します。

更新操作に応答する

ユーザーがスワイプして更新の操作を行うと、進行状況インジケーターが表示され、アプリのコールバック メソッドを呼び出します。コールバック メソッドでアプリのデータを更新します。

アプリで更新操作に応答するには、SwipeRefreshLayout.OnRefreshListener インターフェースとその onRefresh() メソッドを実装します。onRefresh() メソッドは、ユーザーがスワイプ操作を行ったときに呼び出されます。

実際の更新処理のコードを別のメソッド(できれば ViewModel)に入れ、その更新メソッドを onRefresh() の実装から呼び出します。こうすることで、ユーザーがアクションバーから更新をトリガーしたときに、同じ更新メソッドを使用して更新を実行できます。

update メソッドで、データの更新が完了したら setRefreshing(false) を呼び出します。このメソッドを呼び出すと、SwipeRefreshLayout に対して、進行状況インジケーターを削除してビュー コンテンツを更新するよう指示できます。

たとえば、次のコードは onRefresh() を実装し、myUpdateOperation() メソッドを呼び出して、ListView によって表示されるデータを更新します。

Kotlin

// Sets up a SwipeRefreshLayout.OnRefreshListener that invokes when
// the user performs a swipe-to-refresh gesture.

mySwipeRefreshLayout.setOnRefreshListener {
    Log.i(LOG_TAG, "onRefresh called from SwipeRefreshLayout")

    // This method performs the actual data-refresh operation and calls
    // setRefreshing(false) when it finishes.
    myUpdateOperation()
}

Java

// Sets up a SwipeRefreshLayout.OnRefreshListener that is invoked when
// the user performs a swipe-to-refresh gesture.

mySwipeRefreshLayout.setOnRefreshListener(() -> {
    Log.i(LOG_TAG, "onRefresh called from SwipeRefreshLayout");

    // This method performs the actual data-refresh operation and calls
    // setRefreshing(false) when it finishes.
    myUpdateOperation();
  }
);

更新アクションに応答する

ユーザーがアクションバーを使用して更新をリクエストすると、onOptionsItemSelected() メソッドが呼び出されます。アプリは、この呼び出しに応答して、進行状況インジケーターを表示し、アプリのデータを更新します。

更新アクションに応答するには、onOptionsItemSelected() をオーバーライドします。オーバーライド メソッドで、値 true を指定して setRefreshing() を呼び出し、SwipeRefreshLayout 進行状況インジケーターをトリガーしてから、更新オペレーションを行います。実際の更新は別のメソッドで実行します。これにより、ユーザーがスワイプで更新をトリガーしても、アクションバーを使用しても、同じメソッドを呼び出せます。更新が完了したら、setRefreshing(false) を呼び出して更新進行状況インジケーターを削除します。

次のコードは、リクエスト アクションに応答する方法を示しています。

Kotlin

// Listen for option item selections to receive a notification when the user
// requests a refresh by selecting the refresh action bar item.

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    when (item.itemId) {

        // Check whether the user triggers a refresh:
        R.id.menu_refresh -> {
            Log.i(LOG_TAG, "Refresh menu item selected")

            // Signal SwipeRefreshLayout to start the progress indicator.
            mySwipeRefreshLayout.isRefreshing = true

            // Start the refresh background task. This method calls
            // setRefreshing(false) when it finishes.
            myUpdateOperation()

            return true
        }
    }

    // User doesn't trigger a refresh. Let the superclass handle this action.
    return super.onOptionsItemSelected(item)
}

Java

// Listen for option item selections to receive a notification when the user
// requests a refresh by selecting the refresh action bar item.

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {

        // Check whether the user triggers a refresh:
        case R.id.menu_refresh:
            Log.i(LOG_TAG, "Refresh menu item selected");

            // Signal SwipeRefreshLayout to start the progress indicator.
            mySwipeRefreshLayout.setRefreshing(true);

            // Start the refresh background task. This method calls
            // setRefreshing(false) when it finishes.
            myUpdateOperation();

            return true;
    }

    // User doesn't trigger a refresh. Let the superclass handle this action.
    return super.onOptionsItemSelected(item);
}