У меня есть приложение на основе Xamarin, которое использует C #.У меня есть страница EmployeeProfile
.На этой странице перечислены все сотрудники.Существует вызов API, который обеспечивает 10 записей одновременно.Когда пользователь прокручивает страницу вниз и когда появляется последний элемент, он вызывает метод Loadmore
, который вызывает API для еще 10 записей.
Я использую AppCenter для отслеживания ошибок и сбоев.Я не получаю ошибку, когда проверяю свой экземпляр.Однако, когда я проверяю отчет о сбоях в AppCenter, на этой странице много сбоев.
Исключение: ThrowHelper.ThrowArgumentOutOfRangeException (аргумент System.ExceptionArgument, ресурс System.ExceptionResource) System.ArgumentOutOfRangeException: индекс находится вне диапазона.Должен быть неотрицательным и меньшим, чем размер коллекции.Имя параметра: index
Ошибка выглядит как в методе getEmployeeProfile()
.Кто-нибудь может подсказать, какая линия вызывает эту проблему и как я могу ее предотвратить?Если предотвращение невозможно, как я могу справиться с этим?
Код:
publish SearchEmployeeResultsViewModel
{
public ObservableRangeCollection<EmployeeProfile> SearchEmployee { get; set; }
public List<EmployeeProfile> ListSearchEmployee { get; set; }
public bool IsNoDataFound { get; set; }
public int currentPage { get; set; }
public int recordCount { get; set; }
public bool IsBusy { get; set; }
//constructor
public SearchEmployeeResultsViewModel()
{
currentPage = 0;
recordCount = 10;
getEmployeeProfile();
}
//Call when user scroll down for more EmployeeProfiles
//Following method call when last item start to visible(ListView event)
private async Task LoadMore()
{
IsBusy = true;
await getEmployeeProfile();
IsBusy = false;
}
//Except/Crash raised from here
private async Task getEmployeeProfile()
{
currentPage++;
//Remove last item if it has no username
//Purpose: We add blank item at end to manage smooth scrolling while getting next page data
if (SearchEmployee.Count > 0 && SearchEmployee.Last().UserName == null)
SearchEmployee.RemoveAt(SearchEmployee.Count() - 1);
ListSearchEmployee.AddRange((await _profileApiClient.SearchEmployeeCall(currentPage, recordCount)));
var differenceList = ListSearchEmployee.Except(SearchEmployee).ToList();
if (differenceList.Count > 0)
{
SearchEmployee.AddRange(differenceList);
//add blank item
SearchEmployee.Add(new EmployeeProfile());
}
IsNoDataFound = (SearchEmployee == null || SearchEmployee.Count() == 0);
}
}
Трассировка стека ошибок:
ThrowHelper.ThrowArgumentOutOfRangeException (System.ExceptionArgument argument, System.ExceptionResource resource)
System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index
ThrowHelper.ThrowArgumentOutOfRangeException (System.ExceptionArgument argument, System.ExceptionResource resource)
ThrowHelper.ThrowArgumentOutOfRangeException ()
List`1[T].get_Item (System.Int32 index)
Collection`1[T].get_Item (System.Int32 index)
ReadOnlyCollection`1[T].get_Item (System.Int32 index)
RendererPool.UpdateRenderers (Xamarin.Forms.Element newElement)
RendererPool.UpdateNewElement (Xamarin.Forms.VisualElement newElement)
VisualElementPackager.SetElement (Xamarin.Forms.VisualElement oldElement, Xamarin.Forms.VisualElement newElement)
VisualElementPackager.OnRendererElementChanged (System.Object sender, Xamarin.Forms.Platform.iOS.VisualElementChangedEventArgs args)
VisualElementRenderer`1[TElement].OnElementChanged (Xamarin.Forms.Platform.iOS.ElementChangedEventArgs`1[TElement] e)
VisualElementRenderer`1[TElement].SetElement (TElement element)
IVisualElementRenderer.SetElement (Xamarin.Forms.VisualElement element)
RendererPool.UpdateRenderers (Xamarin.Forms.Element newElement)
RendererPool.UpdateNewElement (Xamarin.Forms.VisualElement newElement)
VisualElementPackager.SetElement (Xamarin.Forms.VisualElement oldElement, Xamarin.Forms.VisualElement newElement)
VisualElementPackager.OnRendererElementChanged (System.Object sender, Xamarin.Forms.Platform.iOS.VisualElementChangedEventArgs args)
VisualElementRenderer`1[TElement].OnElementChanged (Xamarin.Forms.Platform.iOS.ElementChangedEventArgs`1[TElement] e)
VisualElementRenderer`1[TElement].SetElement (TElement element)
IVisualElementRenderer.SetElement (Xamarin.Forms.VisualElement element)
RendererPool.UpdateRenderers (Xamarin.Forms.Element newElement)
RendererPool.UpdateNewElement (Xamarin.Forms.VisualElement newElement)
VisualElementPackager.SetElement (Xamarin.Forms.VisualElement oldElement, Xamarin.Forms.VisualElement newElement)
VisualElementPackager.OnRendererElementChanged (System.Object sender, Xamarin.Forms.Platform.iOS.VisualElementChangedEventArgs args)
VisualElementRenderer`1[TElement].OnElementChanged (Xamarin.Forms.Platform.iOS.ElementChangedEventArgs`1[TElement] e)
VisualElementRenderer`1[TElement].SetElement (TElement element)
IVisualElementRenderer.SetElement (Xamarin.Forms.VisualElement element)
RendererPool.UpdateRenderers (Xamarin.Forms.Element newElement)
RendererPool.UpdateNewElement (Xamarin.Forms.VisualElement newElement)
VisualElementPackager.SetElement (Xamarin.Forms.VisualElement oldElement, Xamarin.Forms.VisualElement newElement)
VisualElementPackager.OnRendererElementChanged (System.Object sender, Xamarin.Forms.Platform.iOS.VisualElementChangedEventArgs args)
VisualElementRenderer`1[TElement].OnElementChanged (Xamarin.Forms.Platform.iOS.ElementChangedEventArgs`1[TElement] e)
VisualElementRenderer`1[TElement].SetElement (TElement element)
IVisualElementRenderer.SetElement (Xamarin.Forms.VisualElement element)
ViewCellRenderer+ViewTableCell.UpdateCell (Xamarin.Forms.ViewCell cell)
ViewCellRenderer+ViewTableCell.set_ViewCell (Xamarin.Forms.ViewCell value)
ViewCellRenderer.GetCell (Xamarin.Forms.Cell item, UIKit.UITableViewCell reusableCell, UIKit.UITableView tv)
CustomViewCellRenderer.GetCell (Xamarin.Forms.Cell item, UIKit.UITableViewCell reusableCell, UIKit.UITableView tv)
CellTableViewCell.GetNativeCell (UIKit.UITableView tableView, Xamarin.Forms.Cell cell, System.Boolean recycleCells, System.String templateId)
ListViewRenderer+ListViewDataSource.GetCell (UIKit.UITableView tableView, Foundation.NSIndexPath indexPath)
(wrapper managed-to-native) ObjCRuntime.Messaging:objc_msgSend (intptr,intptr)
UITableView.EndUpdates ()
ListViewRenderer.UpdateItems (System.Collections.Specialized.NotifyCollectionChangedEventArgs e, System.Int32 section, System.Boolean resetWhenGrouped)
ListViewRenderer.OnCollectionChanged (System.Object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
TemplatedItemsList`2[TView,TItem].OnCollectionChanged (System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
TemplatedItemsList`2[TView,TItem].OnProxyCollectionChanged (System.Object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e, System.Boolean fixWindows)
TemplatedItemsList`2[TView,TItem].OnProxyCollectionChanged (System.Object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
ListProxy.OnCollectionChanged (System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
ListProxy+<>c__DisplayClass33_0.<OnCollectionChanged>b__0 ()
ListProxy.OnCollectionChanged (System.Object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
ListProxy+WeakNotifyProxy.OnCollectionChanged (System.Object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
ObservableCollection`1[T].OnCollectionChanged (System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
ObservableRangeCollection`1[T].OnCollectionChanged (System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
ObservableCollection`1[T].OnCollectionChanged (System.Collections.Specialized.NotifyCollectionChangedAction action, System.Object item, System.Int32 index)
ObservableCollection`1[T].InsertItem (System.Int32 index, T item)
Collection`1[T].Add (T item)
SearchEmployeeResultsViewModel+<getEmployeeProfile>d__76.MoveNext ()
ExceptionDispatchInfo.Throw ()
TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task task)
TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Task task)
TaskAwaiter.ValidateEnd (System.Threading.Tasks.Task task)
TaskAwaiter.GetResult ()
SearchEmployeeResultsViewModel+<LoadMore>d__75.MoveNext ()
ExceptionDispatchInfo.Throw ()
AsyncMethodBuilderCore+<>c.<ThrowAsync>b__6_0 (System.Object state)
UIKitSynchronizationContext+<Post>c__AnonStorey0.<>m__0 ()
NSAsyncActionDispatcher.Apply ()
(wrapper managed-to-native) UIKit.UIApplication:UIApplicationMain (int,string[],intptr,intptr)
UIApplication.Main (System.String[] args, System.IntPtr principal, System.IntPtr delegate)
UIApplication.Main (System.String[] args, System.String principalClassName, System.String delegateClassName)
Application.Main (System.String[] args)