android - 使用 MvxAdapter 时出现异常

标签 android listview xamarin mvvmcross

我有以下设置: 具有 2 个选项卡的应用程序。在第二个选项卡上有一个绑定(bind)到 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。创建绑定(bind)后,默认的 MvxAdapter 订阅列表绑定(bind)到的集合的集合更改事件。然而,当 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,异常就会停止。

关于android - 使用 MvxAdapter 时出现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25416700/

相关文章:

xamarin - 删除 Xamarin.Forms 网格单元之间的间距

android - Xamarin Android onScrollListener 被多次调用

c# - 如何在 xamarin 表单中的标签文本上画一条线

android - 使用 configChanges 检查屏幕方向

java - 如何像软键盘一样将 PopupWindow 设置在根布局的底部?

winforms - powershell 中的 System.Windows.Forms.ListView 隐藏输出

java - 在 ListView 的特定位置显示图像

java - 带有自定义适配器的 ListView 图像和文本

android - RecyclerView中CardView没有点击效果

android - 使用 Dagger2 的多模块 android 应用程序,在功能模块中不使用 `kapt`