0

У меня возникли проблемы с обновлением ItemsSource в списке после того, как он был выложен. Я использую асинхронный вызов веб-службы для заполнения таблицы, и она отлично работает, если я жду получения данных перед созданием страницы, содержащей список. Однако, когда я пытаюсь загрузить listview асинхронно, я получаю либо исключение ссылочной ссылки, либо исключение из диапазона вне диапазона.Xamarin.Forms ListView ItemsSource - Async Update NullReferenceException

-Если я добавляю входящие данные в новую коллекцию и затем назначаю ее как itemsSource, я получаю исключение ArgumentOutOfRangeException.

-Если я пытаюсь добавить новые элементы непосредственно к своим itemsSource, я получаю исключение нулевой ссылки после вставки первой записи.

Ive подтвердил с помощью отладчика, что никакие нулевые значения не назначены, и похоже, что это исключение связано с тем, что объект был собран слишком рано - я не уверен, какой объект он имеет в виду.

ОБНОВЛЕНИЕ: Проблема возникает только при реализации iOS. Listview загружает входящие данные точно так, как ожидалось на Android.

Вот мой ListView:

public class TransferListView : ListView 
{ 

    public ObservableCollection<TransferCell> transferCells; 

    public TransferListView() 
    { 
     var curData = ESPMobileDS.GetSharedInstance(); 
     transferCells = new ObservableCollection<TransferCell>(); 

     ItemTemplate = TransferListView.GetCellTemplate(); 
     ItemsSource = transferCells; 

     RowHeight = 75; 
     HorizontalOptions = LayoutOptions.FillAndExpand; 
     VerticalOptions = LayoutOptions.FillAndExpand; 
     BackgroundColor = ESPResources.Color.SoftBackgroundColorLight2; 

     BindingContext = TransferCell.IdentityProperty; 

     ItemSelected += async (sender, e) => 
     { 
      curData.SelectedTransfer = e.SelectedItem as TransferCell; 
      await Navigation.PushAsync(new ItemDetailPage(DetailItemType.Transfer)); 
     }; 
    } 

    public static DataTemplate GetCellTemplate() 
    { 
     var cell = new DataTemplate(typeof(TransferCell)); 
     cell.SetBinding(TransferCell.AccountFromProperty, "AccountFrom"); 
     cell.SetBinding(TransferCell.AccountToProperty, "AccountTo"); 
     cell.SetBinding(TransferCell.DateProperty, "Date"); 
     cell.SetBinding(TransferCell.DescriptionProperty, "Description"); 
     cell.SetBinding(TransferCell.AmountProperty, "Amount"); 
     cell.SetBinding(TransferCell.IdentityProperty, "Identity"); 
     cell.SetBinding(TransferCell.CanDeleteProperty, "CanDelete"); 
     cell.SetBinding(TransferCell.IsPendingProperty, "IsPending"); 

     return cell; 
    } 

    public void ParseAndReceiveServerResponse(string data) { 

     var curData = ESPMobileDS.GetSharedInstance(); 

     var deserializationSettings = new JsonSerializerSettings 
     { 
      NullValueHandling = NullValueHandling.Ignore, 
      MissingMemberHandling = MissingMemberHandling.Ignore 
     }; 

     Dictionary<string, TransferInfoListResponse> transferDict = JsonConvert.DeserializeObject<Dictionary<string, TransferInfoListResponse>>(data, deserializationSettings); 

     var transfers = transferDict["d"].Transfers; 



     if (transfers != null) { 

      Device.BeginInvokeOnMainThread(() => { 


       curData.currentPage.RemoveLoadingModal(); 

       for (int i = 0; i < transfers.Count; i++) { 


        transferCells.Add(new TransferCell 
        { 
         AccountFrom = curData.GetNameForAccountNumber(transfers[i].FromAccount).ToUpper(), 
         AccountTo = curData.GetNameForAccountNumber(transfers[i].ToAccount).ToUpper(), 
         Description = transfers[i].Description, 
         Date = transfers[i].Date, 
         ID = i, 
         Amount = transfers[i].Amount, 
         CanDelete = transfers[i].CanDelete, 
         IsPending = transfers[i].IsPending 
        }); 



       } 

      }); 
     } 

    } 
} 

А вот страница, которую он содержится в:

public class TransferPage : ESPMobilePage 
{ 
    BindableBoolean amountEntryVisible; 
    CustomEntry amountEntry; 
    TransferListView transferListView { set; get; } 

    AbsoluteLayout addTransferModal { set; get; } 

    Picker fromPicker; 
    Picker toPicker; 
    Picker amountPicker; 


    protected override async void OnAppearing() { 
     base.OnAppearing(); 
     var curData = ESPMobileDS.GetSharedInstance(); 

     await curData.PostToServer(curData.GetPostDataForResponseType(ResponseType.TransferInfoResponse), ESPResources.WebService.URL.GetTransferListMethod).ContinueWith((transferListResponse) => { 

      transferListView.ParseAndReceiveServerResponse(transferListResponse.Result); 
     }); 
    } 

    public TransferPage() 
    { 
     Title = " "; 
     Icon = ESPResources.Image.SystemImage.Empty; 
     NavigationPage.SetTitleIcon(this, ESPResources.Image.SystemImage.Empty); 

     var curData = ESPMobileDS.GetSharedInstance(); 
     curData.SetCurrentPage(this); 

     amountEntryVisible = new BindableBoolean(); 
     amountEntryVisible.ShouldBeVisible = false; 


     layout = new AbsoluteLayout() { 
      HorizontalOptions = LayoutOptions.FillAndExpand, 
      VerticalOptions = LayoutOptions.FillAndExpand 
     }; 

     var addTransferTapRecognizer = new TapGestureRecognizer 
     { 
      Command = new Command(() => { 
       OnAddTransfer(); 
      }), 
      NumberOfTapsRequired = 1 
     }; 

     var addButton = new CachedImage 
     { 
      Source = ESPResources.Image.SystemImage.AddButton, 
      Aspect = Aspect.Fill 
     }; 
     addButton.GestureRecognizers.Add(addTransferTapRecognizer); 

     CustomNavigationBar navigationBar = new CustomNavigationBar(ESPResources.Text.Symbol.MenuSymbol, ESPResources.FontFamily.SymbolFont, LayoutGen.BuildMenuTapHandler()); 

     transferListView = new TransferListView(); 

     var unfinishedLayout = LayoutGen.BuildNewCoreLayout(ESPResources.Text.Title.TransferPage.ToUpper(), transferListView, navigationBar); 
     var mainLayout = LayoutGen.AddCoreLayoutButton(addButton, unfinishedLayout); 

     AbsoluteLayout.SetLayoutBounds (unfinishedLayout, new Rectangle(0,0,1,1)); 
     AbsoluteLayout.SetLayoutFlags (unfinishedLayout, AbsoluteLayoutFlags.All); 

     layout.Children.Add(mainLayout); 
     Content = layout; 
    } 

А вот StackTrace из NullReferenceException:

Nov 28 08:26:03 apples-iMac ESPMobileiOS[24684]: 
    Unhandled Exception: 
    System.NullReferenceException: Object reference not set to an instance of an object 
     at (wrapper managed-to-native) UIKit.UIApplication:UIApplicationMain (int,string[],intptr,intptr) 
     at UIKit.UIApplication.Main (System.String[] args, System.IntPtr principal, System.IntPtr delegate) [0x00005] in /Users/builder/data/lanes/3969/44931ae8/source/xamarin-macios/src/UIKit/UIApplication.cs:79 
     at UIKit.UIApplication.Main (System.String[] args, System.String principalClassName, System.String delegateClassName) [0x00038] in /Users/builder/data/lanes/3969/44931ae8/source/xamarin-macios/src/UIKit/UIApplication.cs:63 
     at ESPMobile.iOS.Application.Main (System.String[] args) [0x00008] in /Users/clarkin/Projects/ewu-larkinc/ESPMobile/iOS/Main.cs:13 
Nov 28 08:26:03 apples-iMac ESPMobileiOS[24684]: Unhandled managed exception: 
    Object reference not set to an instance of an object (System.NullReferenceException) 
     at (wrapper managed-to-native) UIKit.UIApplication:UIApplicationMain (int,string[],intptr,intptr) 
     at UIKit.UIApplication.Main (System.String[] args, System.IntPtr principal, System.IntPtr delegate) [0x00005] in /Users/builder/data/lanes/3969/44931ae8/source/xamarin-macios/src/UIKit/UIApplication.cs:79 
     at UIKit.UIApplication.Main (System.String[] args, System.String principalClassName, System.String delegateClassName) [0x00038] in /Users/builder/data/lanes/3969/44931ae8/source/xamarin-macios/src/UIKit/UIApplication.cs:63 
     at ESPMobile.iOS.Application.Main (System.String[] args) [0x00008] in /Users/clarkin/Projects/ewu-larkinc/ESPMobile/iOS/Main.cs:13 
Nov 28 08:26:03 apples-iMac ESPMobileiOS[24684]: critical: Stacktrace: 
Nov 28 08:26:03 apples-iMac ESPMobileiOS[24684]: critical: 
    Native stacktrace: 
Nov 28 08:26:03 apples-iMac ESPMobileiOS[24684]: critical: 0 ESPMobileiOS      0x000000010b21f6bd mono_handle_native_sigsegv + 253 
Nov 28 08:26:03 apples-iMac ESPMobileiOS[24684]: critical: 1 libsystem_platform.dylib   0x00000001119a3bba _sigtramp + 26 
Nov 28 08:26:03 apples-iMac ESPMobileiOS[24684]: critical: 2 ???         0x000000010b61f99b 0x0 + 4485937563 
Nov 28 08:26:03 apples-iMac ESPMobileiOS[24684]: critical: 3 libsystem_c.dylib     0x00000001116fafd7 abort + 129 
Nov 28 08:26:03 apples-iMac ESPMobileiOS[24684]: critical: 4 ESPMobileiOS      0x000000010b3c4f0f xamarin_unhandled_exception_handler + 47 
Nov 28 08:26:03 apples-iMac ESPMobileiOS[24684]: critical: 5 ESPMobileiOS      0x000000010b21ff8c mono_invoke_unhandled_exception_hook + 92 
Nov 28 08:26:03 apples-iMac ESPMobileiOS[24684]: critical: 6 ESPMobileiOS      0x000000010b21ef0f mono_handle_exception_internal + 5119 
Nov 28 08:26:03 apples-iMac ESPMobileiOS[24684]: critical: 7 ESPMobileiOS      0x000000010b21db08 mono_handle_exception + 24 
Nov 28 08:26:03 apples-iMac ESPMobileiOS[24684]: critical: 8 ESPMobileiOS      0x000000010b19867f mono_amd64_throw_exception + 143 
Nov 28 08:26:03 apples-iMac ESPMobileiOS[24684]: critical: 9 ???         0x000000011dcaa9e7 0x0 + 4794788327 
Nov 28 08:26:03 apples-iMac ESPMobileiOS[24684]: critical: 10 ESPMobileiOS      0x000000010b3ca845 xamarin_invoke_trampoline + 7541 
Nov 28 08:26:03 apples-iMac ESPMobileiOS[24684]: critical: 11 ESPMobileiOS      0x000000010b3d1cdd xamarin_arch_trampoline + 189 
Nov 28 08:26:03 apples-iMac ESPMobileiOS[24684]: critical: 12 ESPMobileiOS      0x000000010b3d3021 xamarin_x86_64_common_trampoline + 110 
Nov 28 08:26:03 apples-iMac ESPMobileiOS[24684]: critical: 13 UIKit        0x000000010b80f7b5 -[UITableView _createPreparedCellForGlobalRow:withIndexPath:willDisplay:] + 757 
Nov 28 08:26:03 apples-iMac ESPMobileiOS[24684]: critical: 14 UIKit        0x000000010b80fa13 -[UITableView _createPreparedCellForGlobalRow:willDisplay:] + 74 
Nov 28 08:26:03 apples-iMac ESPMobileiOS[24684]: critical: 15 UIKit        0x000000010b7e347d -[UITableView _updateVisibleCellsNow:isRecursive:] + 3295 
Nov 28 08:26:03 apples-iMac ESPMobileiOS[24684]: critical: 16 UIKit        0x000000010b818d95 -[UITableView _performWithCachedTraitCollection:] + 110 
Nov 28 08:26:03 apples-iMac ESPMobileiOS[24684]: critical: 17 UIKit        0x000000010b7ff5ef -[UITableView layoutSubviews] + 222 
Nov 28 08:26:03 apples-iMac ESPMobileiOS[24684]: critical: 18 UIKit        0x000000010b766f50 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 1237 
Nov 28 08:26:03 apples-iMac ESPMobileiOS[24684]: critical: 19 QuartzCore       0x000000010d5bbcc4 -[CALayer layoutSublayers] + 146 
Nov 28 08:26:03 apples-iMac ESPMobileiOS[24684]: critical: 20 QuartzCore       0x000000010d5af788 _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 366 
Nov 28 08:26:03 apples-iMac ESPMobileiOS[24684]: critical: 21 QuartzCore       0x000000010d5af606 _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 24 
Nov 28 08:26:03 apples-iMac ESPMobileiOS[24684]: critical: 22 QuartzCore       0x000000010d53d680 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 280 
Nov 28 08:26:03 apples-iMac ESPMobileiOS[24684]: critical: 23 QuartzCore       0x000000010d56a767 _ZN2CA11Transaction6commitEv + 475 
Nov 28 08:26:03 apples-iMac ESPMobileiOS[24684]: critical: 24 QuartzCore       0x000000010d56b0d7 _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 113 
Nov 28 08:26:03 apples-iMac ESPMobileiOS[24684]: critical: 25 CoreFoundation      0x000000010ef88e17 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23 
Nov 28 08:26:03 apples-iMac ESPMobileiOS[24684]: critical: 26 CoreFoundation      0x000000010ef88d87 __CFRunLoopDoObservers + 391 
Nov 28 08:26:03 apples-iMac ESPMobileiOS[24684]: critical: 27 CoreFoundation      0x000000010ef6db9e __CFRunLoopRun + 1198 
Nov 28 08:26:03 apples-iMac ESPMobileiOS[24684]: critical: 28 CoreFoundation      0x000000010ef6d494 CFRunLoopRunSpecific + 420 
Nov 28 08:26:03 apples-iMac ESPMobileiOS[24684]: critical: 29 GraphicsServices     0x00000001106f5a6f GSEventRunModal + 161 
Nov 28 08:26:03 apples-iMac ESPMobileiOS[24684]: critical: 30 UIKit        0x000000010b6a2964 UIApplicationMain + 159 
Nov 28 08:26:03 apples-iMac ESPMobileiOS[24684]: critical: 31 ???         0x000000011f656ca2 0x0 + 4821707938 
Nov 28 08:26:03 apples-iMac ESPMobileiOS[24684]: critical: 32 ???         0x000000011f656b30 0x0 + 4821707568 
Nov 28 08:26:03 apples-iMac ESPMobileiOS[24684]: critical: 
    ================================================================= 
    Got a SIGABRT while executing native code. This usually indicates 
    a fatal error in the mono runtime or one of the native libraries 
    used by your application. 
+0

Есть Трассировка стека доступны, когда NullRef выкинут? Это поможет вам отследить его. –

+0

Хорошо, я добавил stacktrace - у меня проблемы с поиском чего-нибудь полезного в нем. – Chieftexas

+0

Можете ли вы подтвердить, что curData.GetNameForAccountNumber() не возвращает значение null? Возможно, вы сможете отследить его, установив отладчик на разрыв любого Исключения – therealjohn

ответ

0

I похоже, что проблема связана с обновлением ObservableCollections на iOS. Попробуйте вместо этого заменить все. Например, на нижней части метода ParseAndReceiveServerResponse попробовать это:

var tempList = new List<TransferCell>(); 

for (int i = 0; i < transfers.Count; i++) 
{ 
    tempList.Add(new TransferCell 
    { 
     AccountFrom = curData.GetNameForAccountNumber(transfers[i].FromAccount).ToUpper(), 
     AccountTo = curData.GetNameForAccountNumber(transfers[i].ToAccount).ToUpper(), 
     Description = transfers[i].Description, 
     Date = transfers[i].Date, 
     ID = i, 
     Amount = transfers[i].Amount, 
     CanDelete = transfers[i].CanDelete, 
     IsPending = transfers[i].IsPending 
    }); 
} 

ItemsSource = new ObservableCollection<TransferCell>(tempList); 
+0

Спасибо за вашу помощь, к сожалению, я все еще получаю ту же ошибку. Templist становится полностью заполненным, как я ожидал (содержит 71 действительные записи), но когда я назначаю itemssource - окно вывода приложения показывает только 1 TransferCell, который выкладывается до того, как будет выбрано исключение нулевой ссылки. – Chieftexas

+0

Есть ли пустые значения во втором TransferCell? –

+0

Нет, нет - я использовал некоторые дополнительные инструкции для печати, чтобы подтвердить, что все входящие объекты передачи полностью заполнены. – Chieftexas