W tym dokumencie pokazujemy, jak zaktualizować aplikację, gdy użytkownik poprosi o ręczne odświeżenie, niezależnie od tego, czy wywoła je gestem przesuwania, czy użyje działania odświeżania na pasku działań.
Reagowanie na gest odświeżania
Gdy użytkownik wykona gest odświeżania przez przesunięcie, system wyświetli wskaźnik postępu i wywoła metodę wywołania zwrotnego aplikacji. Metoda wywołania zwrotnego jest odpowiedzialna za aktualizowanie danych aplikacji.
Aby reagować 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 przesunięcia.
Kod rzeczywistej operacji aktualizacji umieść w osobnej metodzie, najlepiej w ViewModel, i wywołaj tę metodę aktualizacji z implementacji onRefresh(). Dzięki temu możesz użyć tej samej metody aktualizacji, aby przeprowadzić aktualizację, gdy użytkownik odświeży dane na pasku działań.
W metodzie aktualizacji wywołaj
setRefreshing(false)
po zakończeniu aktualizacji danych. Wywołanie tej metody powoduje, że SwipeRefreshLayoutusuwa wskaźnik postępu i aktualizuje zawartość widoku.
Na przykład poniższy kod implementuje onRefresh() i wywołuje metodę myUpdateOperation(), aby zaktualizować 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(); } );
Odpowiadanie na działanie odświeżania
Jeśli użytkownik poprosi o odświeżenie za pomocą paska działań, system wywoła metodę
onOptionsItemSelected(). Aplikacja odpowiada na to wywołanie, wyświetlając wskaźnik postępu i odświeżając dane.
Aby odpowiedzieć na działanie odświeżania, zastąp funkcję
onOptionsItemSelected(). W metodzie zastąpienia wywołaj wskaźnik postępu SwipeRefreshLayout, wywołując setRefreshing() z wartością true, a następnie wykonaj operację aktualizacji. Przeprowadź aktualizację w osobnej metodzie, aby można było wywołać tę samą metodę niezależnie od tego, czy użytkownik wywoła aktualizację gestem, czy użyje paska działań. Po zakończeniu aktualizacji wywołaj setRefreshing(false), aby usunąć wskaźnik postępu odświeżania.
Poniższy kod pokazuje, jak odpowiedzieć na działanie żądania:
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); }