Cómo responder a una solicitud de actualización

En esta lección, se muestra cómo actualizar tu app cuando el usuario solicita una actualización manual, ya sea que active la actualización deslizando 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 el dedo, 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 realizar la actualización de 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.

Debes incluir el código de la operación de actualización real en un método separado y llamar a este desde tu implementación 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.

Tu método de actualización llamará 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.

El siguiente código, por ejemplo, implementa onRefresh() e invoca el método myUpdateOperation() para actualizar los datos que muestra la ListView:

Kotlin

    /*
     * 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.
        // The method calls setRefreshing(false) when it's finished.
        myUpdateOperation()
    }
    

Java

    /*
     * Sets up a SwipeRefreshLayout.OnRefreshListener that is invoked when the user
     * performs a swipe-to-refresh gesture.
     */
    mySwipeRefreshLayout.setOnRefreshListener(
        new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                Log.i(LOG_TAG, "onRefresh called from SwipeRefreshLayout");

                // This method performs the actual data-refresh operation.
                // The method calls setRefreshing(false) when it's finished.
                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(). Como respuesta a esta llamada, tu app debería mostrar el indicador de progreso y actualizar 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. Una vez más, deberías realizar la actualización 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. Una vez que 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 so that we 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 if user triggered 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's finished.
                myUpdateOperation()

                return true
            }
        }

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

Java

    /*
     * Listen for option item selections so that we 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 if user triggered 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's finished.
                myUpdateOperation();

                return true;
        }

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

Nota: Cuando el usuario activa una actualización mediante la acción de deslizar el dedo como se describe en Cómo responder al gesto de actualizar, no necesitas llamar a setRefreshing(). El widget de SwipeRefreshLayout se encarga de mostrar el indicador de progreso y de quitarlo cuando finaliza la actualización. Sin embargo, si la actualización se activa por otro medio que no sea el gesto de deslizar el dedo, deberás activar explícitamente el indicador de progreso con setRefreshing(). El método que se encarga de actualizar los datos llama a setRefreshing(false) a fin de indicar que finalizó el proceso.