Исключения при использовании MvxAdapter

У меня есть следующая настройка: приложение с двумя вкладками. На второй вкладке ListView привязан к ObservableCollection. На первой вкладке есть элементы управления, которые заставляют ViewModel для второй вкладки перезагружать ObservableCollection. Он работал хорошо, пока я не добавил пользовательский MvxAdapter (это нужно для полиморфных элементов списка). После этого после каждого обновления я вижу следующие исключения в выводе приложения (обратите внимание, что список все еще перезагружает свои значения):

mvx:Warning: 42.24 Exception masked during Adapter RealNotifyDataSetChanged ArgumentException: 'jobject' must not be IntPtr.Zero. Parameter name: jobject at Android.Runtime.JNIEnv.CallNonvirtualVoidMethod (IntPtr jobject, IntPtr jclass, IntPtr jmethod) [0x00010] in /Users/builder/data/lanes/monodroid-mlion-monodroid-4.14-series/8e79d361/source/monodroid/src/Mono.Android/src/Runtime/JNIEnv.g.cs:866 at Android.Widget.BaseAdapter.NotifyDataSetChanged () [0x00058] in /Users/builder/data/lanes/monodroid-mlion-monodroid-4.14-series/8e79d361/source/monodroid/src/Mono.Android/platforms/android-19/src/generated/Android.Widget.BaseAdapter.cs:311 at Cirrious.MvvmCross.Binding.Droid.Views.MvxAdapter.RealNotifyDataSetChanged () [0x00000] in <filename unknown>:0 mvx:Warning: 42.24 Exception masked during Adapter RealNotifyDataSetChanged ArgumentException: 'jobject' must not be IntPtr.Zero. Parameter name: jobject at Android.Runtime.JNIEnv.CallNonvirtualVoidMethod (IntPtr jobject, IntPtr jclass, IntPtr jmethod) [0x00010] in /Users/builder/data/lanes/monodroid-mlion-monodroid-4.14-series/8e79d361/source/monodroid/src/Mono.Android/src/Runtime/JNIEnv.g.cs:866 at Android.Widget.BaseAdapter.NotifyDataSetChanged () [0x00058] in /Users/builder/data/lanes/monodroid-mlion-monodroid-4.14-series/8e79d361/source/monodroid/src/Mono.Android/platforms/android-19/src/generated/Android.Widget.BaseAdapter.cs:311 at Cirrious.MvvmCross.Binding.Droid.Views.MvxAdapter.RealNotifyDataSetChanged () [0x00000] in <filename unknown>:0 

Интересно, может ли кто-нибудь помочь мне найти причину, по которой эти исключения брошены.

 public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { base.OnCreateView(inflater, container, savedInstanceState); var view = this.BindingInflate(Resource.Layout.ChildPage_History, null); listView = view.FindViewById<MvxListView> (Resource.Id.history_list); listView.Adapter = new CustomAdapter (this.Activity, (IMvxAndroidBindingContext)BindingContext); return view; } 

Я думаю, проблема вызвана тем, что конструктор MvxListView создает MvxAdapter умолчанию. Когда привязки создаются, MvxAdapter по умолчанию подписывается на событие с изменением коллекции для коллекции, к которой привязан список. Однако, когда MvxListView.Adapter затем устанавливается в CustomAdapter , оригинальный MvxAdapter по-прежнему подписывается на коллекцию. В конечном итоге исходный MvxAdapter получает сбор мусора, поэтому, когда коллекция изменяет обработчик, вызывается с расположенным объектом, и указанное исключение является результатом.

Я решил проблему в своем проекте, получив свой собственный MvxListView который переопределяет конструктор и возвращает адаптер, то есть нет необходимости устанавливать его в OnCreateView:

 public class MyListView : MvxListView { public MyListView(Context context, IAttributeSet attrs) : base(context, attrs, new CustomAdapter(context)) { } } 

Просто измените формат XML, чтобы использовать этот класс вместо MvxListView и исключения должны прекратиться.

Это проблема с потоками. Вы должны поднять изменение свойства источника в правильном потоке. Попробуйте загрузить исходный код в другой проект, а затем верните его обратно в свойство, указанное в списке.