2016-09-02 4 views
0

Я связал один список с веб-сервисом. В первый раз загружается всего 5 предметов, а затем, когда пользователь просматривает список, загружаются остальные 5 предметов. Все прекрасно работает, но я столкнулся с проблемой в одном сценарии. Первый раз, когда список связан (не выполняйте прокрутку), и если я сразу же нажал на какой-либо элемент списка, то событие «ItemTepped» будет запущено, а страница должна быть перенесена на другую страницу, но проблема в том, что она показывает мне ошибку, как показано ниже.Java.Lang.IllegalStateException: содержимое адаптера изменилось, но ListView не получил уведомление (xamarin.forms)

Error Image

Я поставил Активный индикатор для загрузки.

Этот код находится в xamarin.forms (Portable library). Это не проект xamarin.Android.

public partial class NewsGalleryListPage : ContentPage 
    { 
     int totalItems = 0; 
     decimal MaxIndex = 0; 
     int index = 0; 
     List<Newslist> NewsList; 
     public NewsGalleryListPage() 
     { 
      InitializeComponent(); 

      NewsGalleryLists.ItemTapped += NewsGalleryLists_ItemTapped; 
      NewsGalleryLists.ItemAppearing += NewsGalleryLists_ItemAppearing1; 
      loadingIndicator.IsVisible = true; 
      loading.IsRunning = true; 
      loading.IsVisible = true; 
      CallWebServiceForNewsGalleryList(index); 
     } 

     private void NewsGalleryLists_ItemAppearing1(object sender, ItemVisibilityEventArgs e) 
     { 
      try 
      { 
       if (totalItems != 0) 
       { 
        MaxIndex = Math.Ceiling(((decimal)totalItems)/5); 
        if (index < MaxIndex) 
        { 
         if (NewsList != null && e.Item != null && e.Item == NewsList[NewsList.Count - 1]) 
         { 
          index++; 
          if (index != MaxIndex) 
          { 
           loadingIndicator.IsVisible = true; 
           loading.IsVisible = true; 
           loading.IsRunning = true; 
           CallWebServiceForNewsGalleryList(index); 
          } 
         } 
        } 
       } 
      } 
      catch(Exception ex) 
      { 

      } 
     } 

     private void NewsGalleryLists_ItemTapped(object sender, ItemTappedEventArgs e) 
     { 
      var selectedNewsGalleryListItem = sender as Xamarin.Forms.ListView; 
      var obj = selectedNewsGalleryListItem.SelectedItem as CMO.ServicesClasses.Newslist; 
      Navigation.PushAsync(new CMO.Gallery.NewsGalleryDetail(obj)); 
     } 
     public async void CallWebServiceForNewsGalleryList(int index) 
     { 
      try 
      { 
       string lang = "en"; 

       if (Application.Current.Properties.ContainsKey("Language")) 
       { 
        lang = Application.Current.Properties["Language"] as string; 
        // do something with i 
       } 
       List<KeyValuePair<string, string>> values = new List<KeyValuePair<string, string>>(); 
       values.Add(new KeyValuePair<string, string>("lang",lang)); 
       values.Add(new KeyValuePair<string, string>("title", "")); 
       values.Add(new KeyValuePair<string, string>("index", Convert.ToString(index))); 
       values.Add(new KeyValuePair<string, string>("limit", "5")); 
       var response = await GeneralClass.GetResponse<CMO.ServicesClasses.RootObjectNewsGalleryList>("http://14.141.36.212/maharastracmo/api/getnewslist", values); 
       if (response != null) 
       { 

        if (NewsList == null || index==0) 
        { 
         NewsList = new List<Newslist>(); 
        } 
        for(int i = 0; i < response.newslist.Count; i++) 
        { 
         var ObjectNewslist = new Newslist(); 
         ObjectNewslist.page_id = response.newslist[i].page_id; 
         ObjectNewslist.title = response.newslist[i].title; 
         ObjectNewslist.date = response.newslist[i].date; 
         ObjectNewslist.news_photo = response.newslist[i].news_photo; 
         ObjectNewslist.content = response.newslist[i].content; 
         NewsList.Add(ObjectNewslist); 
        } 
        totalItems = response.total_results; 
        NewsGalleryLists.RowHeight = 100; 
        var x = NewsGalleryLists.RowHeight; 
        this.Title = AppResources.LNewsGallery; 
        NewsGalleryLists.ItemsSource = NewsList; 
       } 
      } 
      catch (WebException exception) 
      { 
      } 
      loading.IsVisible = false; 
      loading.IsRunning = false; 
      loadingIndicator.IsVisible = false; 
     } 
    } 

Я прошел через следующую ссылку

https://forums.xamarin.com/discussion/23124/proper-way-to-update-the-tableviews-sections-content https://forums.xamarin.com/discussion/21994/threading-in-xamarin-forms

Я попытался

Xamarin.Forms.Device.BeginInvokeOnMainThread (() => 
     {}); 

Task.Run(() => { }); 

Я не знаю, как обращаться нить в Xamarin формах, как начинающих уровень.

ответ

0

Обычно это происходит, когда вы используете TemplateSelector, но создаете новый для каждой строки. Создайте один экземпляр из TemplateSelector и используйте его.

+0

У меня есть только один DataTemplate. Почему мы должны использовать DataTemplateSelector? Я думаю, что его проблемы с потоком –

+0

Я почти решил проблему. Я просто заменю «ObservableCollection» на «List». Свойство INotifyChanged наследуется в ObservableCollection. но теперь проблема в том, что мой ActiveIndicator (Загрузка) не отображается. –

Смежные вопросы

 Смежные вопросы