我有以下设置:
一个有两个标签的应用程序。在第二个选项卡上,有一个绑定到ObservableCollection的ListView。在第一个选项卡上有一些控件会导致第二个选项卡的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订阅列表绑定到的集合的collection changed事件。但是,当MvxListView.Adapter被设置为CustomAdapter时,原始的MvxAdapter仍然订阅集合。最终,原始的MvxAdapter会被垃圾收集,因此当收集更改时,将使用已释放的对象调用处理程序,显示的异常就是结果。
我通过派生自己的MvxListView解决了项目中的问题,该MvxListView重写构造函数并返回适配器,这意味着无需在oncreateview中设置适配器:

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

只需将布局XML更改为使用该类而不是,异常就应该停止。

10-06 07:07