Cómo responder a una solicitud de actualización

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 use la acción de actualización de la barra de acciones.

Responde al gesto de actualizar

Cuando el usuario realiza el gesto de deslizar para actualizar, el sistema muestra el indicador de progreso y llama al método de devolución de llamada de tu app. El método de devolución de llamada se encarga 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 el método onRefresh() cuando el usuario realiza un gesto de deslizamiento.

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 esa manera, puedes usar el mismo método de actualización cuando el usuario active una actualización desde la barra de acciones.

En el 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 un 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 actualizar

Si el usuario solicita una actualización mediante la barra de acciones, el sistema llama al método onOptionsItemSelected(). Para responder 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 llamando 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 actualización deslizando el dedo o usa la barra de acciones. Cuando finalice la actualización, llama a setRefreshing(false) para quitar el indicador de progreso de la actualizació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);
}