En este documento, se muestra cómo actualizar tu app cuando el usuario solicita una actualización manual, ya sea que la active con un gesto de deslizar el dedo o con la acción de actualizar de la barra de acciones.
Cómo responder al gesto de actualizar
Cuando el usuario hace el gesto de deslizar para actualizar, el sistema muestra el indicador de progreso y llama al método de devolución de llamada de la app. Tu método de devolución de llamada es responsable de actualizar los datos de la app.
Para responder al gesto de actualizar en tu app, implementa la interfaz SwipeRefreshLayout.OnRefreshListener
y su método onRefresh()
. Se invoca al método onRefresh()
cuando el usuario realiza el gesto de deslizar el dedo.
Coloca el código de la operación de actualización real en un método separado, preferentemente en un ViewModel
, y llama a ese método de actualización desde tu implementación de onRefresh()
. De esta manera, puedes usar el mismo método de actualización para realizar esta acción cuando el usuario activa una actualización desde la barra de acciones.
En tu método de actualización, llama a setRefreshing(false)
cuando termine de actualizar los datos. La llamada a este método le indica a SwipeRefreshLayout
que quite el indicador de progreso y actualice el contenido de la vista.
Por ejemplo, el siguiente código implementa onRefresh()
e invoca el método myUpdateOperation()
para actualizar los datos que muestra una 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(); } );
Cómo responder a la acción de actualización
Si el usuario solicita una actualización mediante la barra de acciones, el sistema llama al método onOptionsItemSelected()
. Como respuesta a esta llamada, tu app muestra el indicador de progreso y actualiza los datos de la app.
Para responder a la acción de actualización, anula onOptionsItemSelected()
. En el método de anulación, activa el indicador de progreso SwipeRefreshLayout
mediante una llamada a setRefreshing()
con el valor true
y, luego, realiza la operación de actualización. Realiza la actualización real en un método separado, de manera que se pueda llamar al mismo método, independientemente de si el usuario activa la operación deslizando el dedo o por medio de la barra de acciones. Cuando finalice la actualización, llama a setRefreshing(false)
para quitar el indicador de progreso de la operación.
En el siguiente código, se muestra cómo responder a la acción de solicitud:
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); }