Я связал один список с веб-сервисом. В первый раз загружается всего 5 предметов, а затем, когда пользователь просматривает список, загружаются остальные 5 предметов. Все прекрасно работает, но я столкнулся с проблемой в одном сценарии. Первый раз, когда список связан (не выполняйте прокрутку), и если я сразу же нажал на какой-либо элемент списка, то событие «ItemTepped» будет запущено, а страница должна быть перенесена на другую страницу, но проблема в том, что она показывает мне ошибку, как показано ниже.Java.Lang.IllegalStateException: содержимое адаптера изменилось, но ListView не получил уведомление (xamarin.forms)
Я поставил Активный индикатор для загрузки.
Этот код находится в 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 формах, как начинающих уровень.
У меня есть только один DataTemplate. Почему мы должны использовать DataTemplateSelector? Я думаю, что его проблемы с потоком –
Я почти решил проблему. Я просто заменю «ObservableCollection» на «List». Свойство INotifyChanged наследуется в ObservableCollection. но теперь проблема в том, что мой ActiveIndicator (Загрузка) не отображается. –