Odpowiadanie na żądanie odświeżania

W tym dokumencie opisujemy, jak zaktualizować aplikację, gdy użytkownik poprosi o ręczne odświeżenie – niezależnie od tego, czy użytkownik uruchamia ją gestem przesuwania czy po użyciu paska działań odświeżania.

Reagowanie na gest odświeżania

Gdy użytkownik wykonuje gest przesunięcia, aby odświeżyć, system wyświetla wskaźnik postępu i wywołuje metodę wywołania zwrotnego aplikacji. To Twoja metoda wywołania zwrotnego odpowiada za aktualizację danych aplikacji.

Aby zareagować na gest odświeżania w aplikacji, zaimplementuj interfejs SwipeRefreshLayout.OnRefreshListener i jego metodę onRefresh(). Metoda onRefresh() jest wywoływana, gdy użytkownik wykona gest przesuwania.

Umieść kod faktycznej operacji aktualizacji w osobnej metodzie, najlepiej w interfejsie ViewModel, i wywołaj tę metodę aktualizacji z implementacji onRefresh(). Dzięki temu możesz używać tej samej metody aktualizacji do przeprowadzania aktualizacji po uruchomieniu odświeżania na pasku działań przez użytkownika.

W metodzie aktualizacji wywołaj setRefreshing(false) po zakończeniu aktualizowania danych. Wywołanie tej metody powoduje, że SwipeRefreshLayout usuwa wskaźnik postępu i aktualizuje zawartość widoku.

Na przykład ten kod implementuje onRefresh() i wywołuje metodę myUpdateOperation(), która aktualizuje dane wyświetlane przez 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();
  }
);

Reagowanie na działanie odświeżania

Jeśli użytkownik poprosi o odświeżenie, korzystając z paska działań, system wywołuje metodę onOptionsItemSelected(). Aplikacja odpowiada na to wywołanie, wyświetlając wskaźnik postępu i odświeżając dane aplikacji.

Aby odpowiedzieć na działanie odświeżania, zastąp onOptionsItemSelected(). W metodzie zastępowania aktywuj wskaźnik postępu SwipeRefreshLayout, wywołując metodę setRefreshing() o wartości true, a następnie przeprowadź operację aktualizacji. przeprowadzanie aktualizacji za pomocą osobnej metody, aby można było wywołać tę samą metodę niezależnie od tego, czy użytkownik uruchomi aktualizację przesunięciem palca czy za pomocą paska działań. Po zakończeniu aktualizacji wywołaj setRefreshing(false), aby usunąć wskaźnik postępu odświeżania.

Ten kod pokazuje, jak odpowiedzieć na żądanie:

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);
}