В этом документе показано, как обновить приложение, когда пользователь запрашивает обновление вручную, независимо от того, запускает ли он его жестом смахивания или использует действие обновления панели действий.
Ответ на жест обновления
Когда пользователь делает жест пролистывания для обновления, система отображает индикатор выполнения и вызывает метод обратного вызова вашего приложения. Ваш метод обратного вызова отвечает за обновление данных приложения.
Чтобы отреагировать на жест обновления в вашем приложении, реализуйте интерфейс SwipeRefreshLayout.OnRefreshListener
и его метод onRefresh()
. Метод onRefresh()
вызывается, когда пользователь выполняет жест смахивания.
Поместите код фактической операции обновления в отдельный метод, желательно в ViewModel
, и вызовите этот метод обновления из реализации onRefresh()
. Таким образом, вы можете использовать тот же метод обновления для выполнения обновления, когда пользователь запускает обновление на панели действий.
В методе обновления вызовите setRefreshing(false)
когда он завершит обновление данных. Вызов этого метода дает указание SwipeRefreshLayout
удалить индикатор выполнения и обновить содержимое представления.
Например, следующий код реализует onRefresh()
и вызывает метод myUpdateOperation()
для обновления данных, отображаемых ListView
:
Котлин
// 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() }
Ява
// 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)
чтобы удалить индикатор хода обновления.
Следующий код показывает, как реагировать на действие запроса:
Котлин
// 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) }
Ява
// 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); }