Intereting Posts
Как заставить Proguard сохранять файл ресурсов .xml? Org.codehaus.jackson.map.exc.UnrecognizedPropertyException: непризнанное поле «id» (критерии класса), не помеченное как невежественное Понимание того, какая активность начинается сначала в приложении для Android Как исправить «SQLiteConnection для gms database», которая была утечка Как закодировать WAV в mp3 на Android-устройстве Значок меню Android с заголовком: заголовок не отображается Android ActionBar скрыть / показать при просмотре списка прокрутки Данные о намерениях камеры null в onActivityResult (int requestCode, int resultCode, Intent data) в Samsung S3 Android-клиент и клиент кэша кэш-диска с помощью Picasso Как включить горизонтальную прокрутку на вкладке, например Google Play? Расширение FrameLayout, дочерние представления больше не будут отображаться Есть ли путь, похожий на файл: /// android_asset /, который указывает на каталог приложений? DOMException: play () может быть инициирован только жестом пользователя Создавать, хранить и накачивать пользовательский макет во время выполнения Espresso – Выполнение действия не работает в полноэкранном режиме – InjectEventSecurityException

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