Como responder a solicitações de atualização

Esta lição mostra como atualizar seu app quando o usuário solicita uma atualização manual, seja com o gesto de deslizar ou usando a barra de ações.

Responder ao gesto de atualização

Quando o usuário faz um gesto de deslizar, o sistema exibe o indicador de progresso e chama o método de callback do app. O método de callback é responsável por atualizar os dados do app.

Para responder ao gesto de atualização no seu app, implemente a interface SwipeRefreshLayout.OnRefreshListener e o método onRefresh(). O método onRefresh() é invocado quando o usuário realiza um gesto de deslizar.

Coloque o código da operação de atualização real em um método separado e chame esse método de atualização na implementação onRefresh(). Dessa forma, você poderá usar o mesmo método para realizar a atualização quando o usuário acioná-la na barra de ações.

Seu método de atualização chamará setRefreshing(false) ao concluir a atualização dos dados. A chamada desse método instrui o SwipeRefreshLayout a remover o indicador de progresso e atualizar o conteúdo da visualização.

Por exemplo, o código a seguir implementa onRefresh() e invoca o método myUpdateOperation() para atualizar os dados exibidos pelo 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();
            }
        }
    );
    

Responder à ação de atualizar

Se o usuário solicitar uma atualização usando a barra de ações, o sistema chamará o método onOptionsItemSelected(). O app responderá a essa chamada exibindo o indicador de progresso e atualizando os dados do app.

Para responder à ação de atualização, modifique onOptionsItemSelected(). No seu método de modificação, acione o indicador de progresso SwipeRefreshLayout chamando setRefreshing() com o valor true e execute a operação de atualização. Mais uma vez, realize a atualização real em um método separado, para que o mesmo método possa ser chamado se o usuário acionar a atualização com um gesto de deslizar ou usando a barra de ações. Quando a atualização terminar, chame setRefreshing(false) para remover o indicador de progresso da atualização.

O código a seguir mostra como responder à ação da solicitação:

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

Observação: quando o usuário aciona uma atualização com uma ação de deslizar, conforme descrito em Responder ao gesto de atualização, você não precisa chamar setRefreshing(). O widget SwipeRefreshLayout exibirá o indicador de progresso e o removerá quando a atualização terminar. No entanto, se a atualização for acionada por qualquer outro meio que não seja um gesto de deslizar, você precisará ativar explicitamente o indicador de progresso com setRefreshing(). O método que atualiza as chamadas de dados setRefreshing(false) para sinalizar que a atualização foi concluída.