Xamarin Forms ListView Programatic Refresh No se detiene en Android cuando se carga la página

Tengo el proyecto portable en Visual Studio 2015 con un ListView que consigue poblado con algunos datos vía una llamada de la API con la siguiente función refreshData :

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

refreshData() se llama en

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

Todo está funcionando bien, excepto en Android, donde el indicador de actualización no se detiene o desaparece en EndRefresh() cuando la página se carga inicialmente. La página está en una página TabbedPage para poder ir a una pestaña diferente y luego volver a esta página y el indicador de actualización comienza y se detiene correctamente con la finalización de mi llamada a la API.

¿Por qué la actualización no se detiene cuando la página se carga inicialmente en Android? Cualquier ayuda sería apreciada.

Nota: esto funciona perfectamente cuando corro en iOS.

Hasta ahora he intentado:

  1. Reemplazando myListView.BeginRefresh() con myListView.IsRefreshing = true y myListView.EndRefresh() con myListView.IsRefreshing = false

  2. Uso de Device.BeginInvokeOnMainThread(() => {//update list and endRefresh}) .

  3. Utilizar async void refreshData() lugar de async Task refreshData() .

[Lo siento por el pobre inglés] Prueba de esta manera:

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

Aparantly usted no necesita de la "Tarea" también.

Si el error se produce sólo en Android, es probable que pueda ser eliminado por la forma en que Android maneja los hilos. No permite que los hilos cambien los elementos visuales directamente. A veces cuando intentamos hacer eso lanza una excepción silenciosa y la acción del código no tiene ningún efecto práctico.

Necesita seguir el patrón MVVM

En su ViewModel usted necesita:

  • Implementar INotifyPropertyChanged
  • Defina propiedades como: 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*/ }

  • Defina el método que busque sus datos, en su caso, refreshData()

  • Cambiar el IsRefreshing true / false cuando sea necesario

En tu página debes:

  • Vincule el elemento de vista de listaSource a una propiedad de VM con el valor SetPropertyValue
  • Enlazar ListView.IsRefreshing a IsRefresging de ViewModel:

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

Aquí hay un gran artículo hablando de INotifyPropertyChanged

  • ¿Por qué Xamarin.Forms es tan lento al mostrar algunas etiquetas (especialmente en Android)?
  • Xamarin Forms PCL HttpClient lanzando una excepción no controlada en Android
  • Xamarin.Forms - excepción no controlada en HttpClient SendAsync
  • Xamarin Forms Navegación de página MasterDetail causando un accidente en android , Funciona en iOS y UWP
  • Reenvío de fuerza de Xamarin.Forms View con procesador personalizado
  • Problemas de recursos de Android después de actualizar a Xamarin Forms 2.0
  • Cómo agregar evento de clic en la disposición o marco de pila
  • ¿Cómo detectar Golpe izquierdo y Golpe derecho para Stacklayout en Xamarin.Forms?
  • Xamarin.Forms: alineación incorrecta del texto del botón después del clic (Android)
  • ¿Cómo puedo mostrar una lista anidada de elementos en Xamarin Forms?
  • Xamarin.Forms SetHasNavigationBar causas falsas salto en PushAsync
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.