Android SwipeRefreshLayout Spinner скрывается до завершения - PullRequest
0 голосов
/ 31 марта 2020

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

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

tableRefresh = SwipeRefreshLayout(this)
tableRefresh?.setOnRefreshListener {
    tableRefresh?.isRefreshing = true
    swipeRefreshHandler()
}

// global Intent
var cloudService: Intent? = null

private fun swipeRefreshHandler() {
    // starts a server-update service
    startService(cloudService?.setAction(serverManualSync))
}

cloudServiceBroadcastReceiver = object: BroadcastReceiver() {

    override fun onReceive(context: Context?, intent: Intent?) {

        when (intent?.action) {

            // server-update service notifies of completion
            serverManualSyncComplete -> tableRefresh?.isRefreshing = false

            // other cases

        }

    }

}

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

Что я могу делать не так?

Ответы [ 2 ]

1 голос
/ 31 марта 2020

Это потому, что вы устанавливаете SwipeRefreshLayout для немедленного прекращения обновления.

Метод swipeRefreshHandler() вызывается напрямую.

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

Не могли бы вы показать соответствующий код обратного вызова? Возможно, он работает асинхронно?

0 голосов
/ 31 марта 2020

Ваш код может выглядеть примерно так:

tableRefresh = SwipeRefreshLayout(this)

 tableRefresh?.setOnRefreshListener {
 swipeRefreshHandler()
}

private fun swipeRefreshHandler(loadingState: Boolean = true) {
  if(loadingState){
    //
    // code to reload the data...
    //        
  }
  sideMenuRefresh?.isRefreshing = loadingState
}

, тогда при асинхронном вызове c (например, с использованием сопрограмм или модернизации) вы можете позвонить

swipeRefreshHandler() // loading state for ongoing operation

ИЛИ

swipeRefreshHandler(false) // when data or process completed (success/fail)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...