Intereting Posts
Отключение автозаполнения для текстового поля и полей ввода в Android-приложении Cordova Многострочное усечение края TextView Текстура от texturepacker в LibGDX Android – Сделайте что-нибудь * после того, как * текст изменен в EditText Круглые до 2 знаков после запятой Как воспроизводить мелодию звонка / сигнала тревоги в Android Проект не был создан из-за «Не удалось удалить» project / bin / classes / com ', " Android LruCache в Android 1.6+ Android, Java – рендеринг видео с использованием растровых кадров для обратного просмотра видео (Xuggler) Как рисовать значки на часовом лице у поставщика услуг по износу в Android? Загрузка удаленных изображений Как правильно настроить Android Studio (minSdkVersion из) AndroidManifest.xml? Android «Только оригинальный поток, создавший иерархию представлений, может коснуться его представлений». Ubuntu 64 с Android 64 Bundle не может найти исполняемый файл adb Как получить уникальный идентификатор пользователя One Signal в Mobile?

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() .

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

 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