Val*_*nko 3 android listview mvvmcross xamarin
我有以下设置:一个带有2个标签的应用.在第二个选项卡上有一个绑定到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
Run Code Online (Sandbox Code Playgroud)
我想知道是否有人可以帮助我找出抛出这些异常的原因.
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;
}
Run Code Online (Sandbox Code Playgroud)
小智 5
我认为问题是由于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))
{
}
}
Run Code Online (Sandbox Code Playgroud)
只需更改布局XML即可使用此类而不是MvxListView
异常应该停止.
归档时间: |
|
查看次数: |
612 次 |
最近记录: |