Xamarin Forms ListView Programatic Refresh не останавливается на Android при загрузке страницы

У меня есть проект Portable в Visual Studio 2015 с ListView который заполняется некоторыми данными через вызов API через следующую функцию refreshData :

 async Task refreshData() { myListView.BeginRefresh(); var apiCallResult = await App.Api.myApiGetCall(); myListView.ItemsSource = apiCallResult; myListView.EndRefresh(); } 

refreshData() вызывается в

 protected override void OnAppearing() { base.OnAppearing(); refreshData(); } 

Все работает нормально, кроме Android, где индикатор обновления не останавливается или исчезает на EndRefresh() когда страница изначально загружена. Страница находится в TabbedPage поэтому я могу перейти на другую вкладку, а затем вернуться на эту страницу, и индикатор обновления правильно запустится и завершится с завершением моего вызова API.

Почему обновление не останавливается, когда страница загружается на Android? Любая помощь будет оценена по достоинству.

Примечание. Это работает отлично, когда я запускаю iOS.

До сих пор я пробовал:

  1. Заменяя myListView.BeginRefresh() с помощью myListView.IsRefreshing = true и myListView.EndRefresh() с myListView.IsRefreshing = false

  2. Использование Device.BeginInvokeOnMainThread(() => {//update list and endRefresh}) .

  3. Использование async void refreshData() вместо async Task refreshData() .

Solutions Collecting From Web of "Xamarin Forms ListView Programatic Refresh не останавливается на Android при загрузке страницы"

[Прошу прощения за плохой английский] Попробуй так:

 async void refreshData() { Device.BeginInvokeOnMainThread(() => { myListView.BeginRefresh(); var apiCallResult = await App.Api.myApiGetCall(); myListView.ItemsSource = apiCallResult; myListView.EndRefresh(); }); } 

Апарантируйте, что вам также не нужно возвращать «Задачу».

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

Вы должны следовать шаблону MVVM

На вашем ViewModel вам необходимо:

  • Внедрить INotifyPropertyChanged
  • Определите такие свойства, как private bool _IsRefreshing; public bool IsRefreshing { get{return _IsRefreshing;} set{SetProperty(ref _IsRefreshing, value;} /*So every time the property changes the view is notified*/ } private bool _IsRefreshing; public bool IsRefreshing { get{return _IsRefreshing;} set{SetProperty(ref _IsRefreshing, value;} /*So every time the property changes the view is notified*/ }

  • Определите метод, который извлекает ваши данные, в вашем случае refreshData()

  • Переключайте значение IsRefreshing true / false при необходимости.

На вашей странице вам нужно:

  • Свяжите элемент listview itemSource с собственностью VM с помощью SetPropertyValue
  • Bind ListView.IsRefreshing для ViewModel's IsRefresging:

    MyListView.SetBinding<MyViewModel>(ListView.IsRefreshing, vm => vm.IsRefresging);

Вот отличная статья о INotifyPropertyChanged