Как ответить на запрос обновления

Попробуйте Compose
Jetpack Compose – это рекомендуемый набор инструментов для создания пользовательского интерфейса в Android. Узнайте, как реализовать жест "Потянуть, чтобы обновить" в Compose.

В этом документе показано, как обновить приложение, когда пользователь запрашивает обновление вручную, независимо от того, запускает ли он его с помощью жеста пролистывания или использует действие обновления на панели действий.

Реагирование на жест обновления

Когда пользователь проводит пальцем по экрану, чтобы обновить страницу, система показывает индикатор выполнения и вызывает метод обратного вызова приложения. Метод обратного вызова отвечает за обновление данных приложения.

Чтобы приложение реагировало на жест обновления, реализуйте интерфейс SwipeRefreshLayout.OnRefreshListener и его метод onRefresh(). Метод onRefresh() вызывается, когда пользователь проводит пальцем по экрану.

Поместите код для фактической операции обновления в отдельный метод, желательно в ViewModel, и вызовите этот метод обновления из реализации onRefresh(). Таким образом, вы можете использовать один и тот же метод обновления, когда пользователь запускает обновление с панели действий.

В методе обновления вызовите setRefreshing(false), когда обновление данных будет завершено. Вызов этого метода указывает SwipeRefreshLayout, что нужно удалить индикатор выполнения и обновить содержимое представления.

Например, в следующем коде реализуется onRefresh() и вызывается метод myUpdateOperation(), чтобы обновить данные, которые показываются в 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();
  }
);

Реагирование на действие обновления

Если пользователь запрашивает обновление с помощью панели действий, система вызывает метод onOptionsItemSelected(). В ответ на этот вызов приложение показывает индикатор выполнения и обновляет данные.

Чтобы ответить на действие обновления, переопределите onOptionsItemSelected(). В методе переопределения активируйте индикатор выполнения SwipeRefreshLayout, вызвав setRefreshing() со значением true, а затем выполните операцию обновления. Выполните обновление в отдельном методе, чтобы один и тот же метод можно было вызывать независимо от того, запускает ли пользователь обновление с помощью жеста пролистывания или использует панель действий. Когда обновление завершится, вызовите setRefreshing(false), чтобы убрать индикатор выполнения.

В следующем примере кода показано, как ответить на запрос:

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