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
- Xamarin.Forms XAML - Agregar controles nativos
- ¿Cómo puedo borrar la pila de navegación?
- System.TypeLoadException: No se pudo resolver el tipo con el token 01000019
- Error de compilación: Error con el proyecto de Android en Xamarin.Forms
- Xamarin implementación de Android no utiliza el código más reciente?
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:
-
Reemplazando
myListView.BeginRefresh()
conmyListView.IsRefreshing = true
ymyListView.EndRefresh()
conmyListView.IsRefreshing = false
-
Uso de
Device.BeginInvokeOnMainThread(() => {//update list and endRefresh})
. -
Utilizar
async void refreshData()
lugar deasync Task refreshData()
.
- Xamarin.Forms popup "Nueva Versión Disponible"
- ¿Puedo diseñar la interfaz de usuario en Xamarin.Forms mediante XAML
- Xamarin.Droid causando errores de compilación en Visual Studio 2015 cuando se utiliza Xamarin.Forms
- Cómo desactivar la selección resaltada en listview xamarin.forms en android
- Xamarin.Auth obtener disallowed_useragent error
- Xamarin "intenta invocar el método virtual 'void android.view.View.unFocus (android.view.View)' en una referencia a un objeto nulo"
- Xamarin.Forms untappable ListView (eliminar el efecto de rizo de selección)
- Formularios de Xamarin Android Aplicación no obtener DeviceToken Parse SDK
[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
- Wearable no instalar la aplicación (criterios de funcionalidad de Android Wear)
- IOS Facebook Slide Menu para Android