Quello che voglio fare è una semplice schermata che mostra più elementi in una griglia. Questo può essere facilmente archiviato su Android utilizzando un GridView.Utilizzo di MvxGridView in MvvmCross
In MvvmCross suppongo di dover utilizzare MvxGridView per archiviare lo stesso.
Ecco il mio AXML:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:local="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<Mvx.MvxGridView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
local:MvxBind="ItemsSource Items"
local:MvxItemTemplate="@layout/itemview" />
</LinearLayout>
L'itemview:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:local="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:minWidth="25px"
android:minHeight="25px">
<TextView
android:text="Text"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/textView1"
local:MvxBind="Text Name" />
</LinearLayout>
mio ViewModel:
using System.Collections.ObjectModel;
using Cirrious.MvvmCross.ViewModels;
namespace GridViewBug.Core.ViewModels
{
public class FirstViewModel
: MvxViewModel
{
public FirstViewModel()
{
Items = new ObservableCollection<TestClass>();
Items.Add(new TestClass { Name = "Test1" });
Items.Add(new TestClass { Name = "Test2" });
}
private string _hello = "Hello MvvmCross";
public string Hello
{
get { return _hello; }
set { _hello = value; RaisePropertyChanged(() => Hello); }
}
public ObservableCollection<TestClass> Items { get; set; }
}
public class TestClass
{
public string Name { get; set; }
}
}
Ed ecco cosa succede quando ho eseguito questo esempio:
05-03 16:18:32.799 I/MvxBind (7960): 0.84 Problem seen during binding execution for from Items to ItemsSource - problem TargetInvocationException: Exception has been thrown by the target of an invocation.
05-03 16:18:32.799 I/MvxBind (7960): at System.Reflection.MonoMethod.Invoke (System.Object obj, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x00000] in <filename unknown>:0
05-03 16:18:32.799 I/MvxBind (7960): at System.Reflection.MonoProperty.SetValue (System.Object obj, System.Object value, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] index, System.Globalization.CultureInfo culture) [0x00000] in <filename unknown>:0
05-03 16:18:32.799 I/MvxBind (7960): at System.Reflection.PropertyInfo.SetValue (System.Object obj, System.Object value, System.Object[] index) [0x00000] in <filename unknown>:0
05-03 16:18:32.799 I/MvxBind (7960): at Cirrious.MvvmCross.Binding.Bindings.Target.MvxPropertyInfoTargetBinding.SetValue (System.Object value) [0x00000] in <filename unknown>:0
05-03 16:18:32.799 I/MvxBind (7960): at Cirrious.MvvmCross.Binding.Bindings.MvxFullBinding.UpdateTargetFromSource (Boolean isAvailable, System.Object value) [0x00000] in <filename unknown>:0
05-03 16:18:32.799 I/MvxBind (7960): InnerException was UnsupportedOperationException: Exception of type 'Java.Lang.UnsupportedOperationException' was thrown.
05-03 16:18:32.799 I/MvxBind (7960): at Android.Runtime.JNIEnv.CallNonvirtualVoidMethod (IntPtr jobject, IntPtr jclass, IntPtr jmethod) [0x00023] in /Users/builder/data/lanes/monodroid-lion-bs1/03814ac5/source/monodroid/src/Mono.Android/src/Runtime/JNIEnv.g.cs:604
05-03 16:18:32.799 I/MvxBind (7960): at Android.Views.ViewGroup.RemoveAllViews() [0x00053] in /Users/builder/data/lanes/monodroid-lion-bs1/03814ac5/source/monodroid/src/Mono.Android/platforms/android-8/src/generated/Android.Views.ViewGroup.cs:2582
05-03 16:18:32.799 I/MvxBind (7960): at Cirrious.MvvmCross.Binding.Droid.Views.MvxViewGroupExtensions.Refill (Android.Views.ViewGroup viewGroup, IAdapter adapter) [0x00000] in <filename unknown>:0
05-03 16:18:32.799 I/MvxBind (7960): at Cirrious.MvvmCross.Binding.Droid.Views.MvxViewGroupExtensions.UpdateDataSetFromChange[MvxGridView] (Cirrious.MvvmCross.Binding.Droid.Views.MvxGridView viewGroup, System.Object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs eventArgs) [0x00000] in <filename unknown>:0
05-03 16:18:32.799 I/MvxBind (7960): at Cirrious.MvvmCross.Binding.Droid.Views.MvxGridView.AdapterOnDataSetChanged (System.Object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs eventArgs) [0x00000] in <filename unknown>:0
05-03 16:18:32.799 I/MvxBind (7960): at (wrapper delegate-invoke) <Module>:invoke_void__this___object_NotifyCollectionChangedEventArgs (object,System.Collections.Specialized.NotifyCollectionChangedEventArgs)
05-03 16:18:32.799 I/MvxBind (7960): at Cirrious.MvvmCross.Binding.Droid.Views.MvxAdapterWithChangedEvent.NotifyDataSetChanged (System.Collections.Specialized.NotifyCollectionChangedEventArgs e) [0x00000] in <filename unknown>:0
05-03 16:18:32.799 I/MvxBind (7960): at Cirrious.MvvmCross.Binding.Droid.Views.MvxAdapterWithChangedEvent.NotifyDataSetChanged() [0x00000] in <filename unknown>:0
05-03 16:18:32.799 I/MvxBind (7960): at Cirrious.MvvmCross.Binding.Droid.Views.MvxAdapter.SetItemsSource (IEnumerable value) [0x00000] in <filename unknown>:0
05-03 16:18:32.799 I/MvxBind (7960): at Cirrious.MvvmCross.Binding.Droid.Views.MvxAdapter.set_ItemsSource (IEnumerable value) [0x00000] in <filename unknown>:0
05-03 16:18:32.799 I/MvxBind (7960): at Cirrious.MvvmCross.Binding.Droid.Views.MvxGridView.set_ItemsSource (IEnumerable value) [0x00000] in <filename unknown>:0
05-03 16:18:32.799 I/MvxBind (7960): at (wrapper managed-to-native) System.Reflection.MonoMethod:InternalInvoke (System.Reflection.MonoMethod,object,object[],System.Exception&)
05-03 16:18:32.799 I/MvxBind (7960): at System.Reflection.MonoMethod.Invoke (System.Object obj, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x00000] in <filename unknown>:0
05-03 16:18:32.799 I/MvxBind (7960): --- End of managed exception stack trace ---
05-03 16:18:32.799 I/MvxBind (7960): java.lang.UnsupportedOperationException: removeAllViews() is not supported in AdapterView
05-03 16:18:32.799 I/MvxBind (7960): at android.widget.AdapterView.removeAllViews(AdapterView.java:521)
05-03 16:18:32.799 I/MvxBind (7960): at cirrious.mvvmcross.binding.droid.binders.MvxBindingLayoutInflatorFactory.n_onCreateView(Native Method)
05-03 16:18:32.799 I/MvxBind (7960): at cirrious.mvvmcross.binding.droid.binders.MvxBindingLayoutInflatorFactory.onCreateView(MvxBindingLayoutInflatorFactory.java:29)
05-03 16:18:32.799 I/MvxBind (7960): at android.view.LayoutInflater.createViewFromTag(Layo
05-03 16:18:32.799 I/mono-stdout(7960): MvxBind:Error: 0.84 Problem seen during binding execution for from Items to ItemsSource - problem TargetInvocationException: Exception has been thrown by the target of an invocation.
05-03 16:18:32.799 I/mono-stdout(7960): at System.Reflection.MonoMethod.Invoke (System.Object obj, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x00000] in <filename unknown>:0
05-03 16:18:32.799 I/mono-stdout(7960): at System.Reflection.MonoProperty.SetValue (System.Object obj, System.Object value, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] index, System.Globalization.CultureInfo culture) [0x00000] in <filename unknown>:0
05-03 16:18:32.799 I/mono-stdout(7960): at System.Reflection.PropertyInfo.SetValue (System.Object obj, System.Object value, System.Object[] index) [0x00000] in <filename unknown>:0
05-03 16:18:32.799 I/mono-stdout(7960): at Cirrious.MvvmCross.Binding.Bindings.Target.MvxPropertyInfoTargetBinding.SetValue (System.Object value) [0x00000] in <filename unknown>:0
05-03 16:18:32.809 I/mono-stdout(7960): at Cirrious.MvvmCross.Binding.Bindings.MvxFullBinding.UpdateTargetFromSource (Boolean isAvailable, System.Object value) [0x00000] in <filename unknown>:0
05-03 16:18:32.809 I/mono-stdout(7960): InnerException was UnsupportedOperationException: Exception of type 'Java.Lang.UnsupportedOperationException' was thrown.
05-03 16:18:32.809 I/mono-stdout(7960): at Android.Runtime.JNIEnv.CallNonvirtualVoidMethod (IntPtr jobject, IntPtr jclass, IntPtr jmethod) [0x00023] in /Users/builder/data/lanes/monodroid-lion-bs1/03814ac5/source/monodroid/src/Mono.Android/src/Runtime/JNIEnv.g.cs:604
05-03 16:18:32.809 I/mono-stdout(7960): at Android.Views.ViewGroup.RemoveAllViews() [0x00053] in /Users/builder/data/lanes/monodroid-lion-bs1/03814ac5/source/monodroid/src/Mono.Android/platforms/android-8/src/generated/Android.Views.ViewGroup.cs:2582
05-03 16:18:32.809 I/mono-stdout(7960): at Cirrious.MvvmCross.Binding.Droid.Views.MvxViewGroupExtensions.Refill (Android.Views.ViewGroup viewGroup, IAdapter adapter) [0x00000] in <filename unknown>:0
05-03 16:18:32.809 I/mono-stdout(7960): at Cirrious.MvvmCross.Binding.Droid.Views.MvxViewGroupExtensions.UpdateDataSetFromChange[MvxGridView] (Cirrious.MvvmCross.Binding.Droid.Views.MvxGridView viewGroup, System.Object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs eventArgs) [0x00000] in <filename unknown>:0
05-03 16:18:32.809 I/mono-stdout(7960): at Cirrious.MvvmCross.Binding.Droid.Views.MvxGridView.AdapterOnDataSetChanged (System.Object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs eventArgs) [0x00000] in <filename unknown>:0
05-03 16:18:32.809 I/mono-stdout(7960): at (wrapper delegate-invoke) <Module>:invoke_void__this___object_NotifyCollectionChangedEventArgs (object,System.Collections.Specialized.NotifyCollectionChangedEventArgs)
05-03 16:18:32.809 I/mono-stdout(7960): at Cirrious.MvvmCross.Binding.Droid.Views.MvxAdapterWithChangedEvent.NotifyDataSetChanged (System.Collections.Specialized.NotifyCollectionChangedEventArgs e) [0x00000] in <filename unknown>:0
05-03 16:18:32.809 I/mono-stdout(7960): at Cirrious.MvvmCross.Binding.Droid.Views.MvxAdapterWithChangedEvent.NotifyDataSetChanged() [0x00000] in <filename unknown>:0
05-03 16:18:32.809 I/mono-stdout(7960): at Cirrious.MvvmCross.Binding.Droid.Views.MvxAdapter.SetItemsSource (IEnumerable value) [0x00000] in <filename unknown>:0
05-03 16:18:32.809 I/mono-stdout(7960): at Cirrious.MvvmCross.Binding.Droid.Views.MvxAdapter.set_ItemsSource (IEnumerable value) [0x00000] in <filename unknown>:0
05-03 16:18:32.809 I/mono-stdout(7960): at Cirrious.MvvmCross.Binding.Droid.Views.MvxGridView.set_ItemsSource (IEnumerable value) [0x00000] in <filename unknown>:0
05-03 16:18:32.809 I/mono-stdout(7960): at (wrapper managed-to-native) System.Reflection.MonoMethod:InternalInvoke (System.Reflection.MonoMethod,object,object[],System.Exception&)
05-03 16:18:32.809 I/mono-stdout(7960): at System.Reflection.MonoMethod.Invoke (System.Object obj, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x00000] in <filename unknown>:0
05-03 16:18:32.809 I/mono-stdout(7960): --- End of managed exception stack trace ---
05-03 16:18:32.809 I/mono-stdout(7960): java.lang.UnsupportedOperationException: removeAllViews() is not supported in AdapterView
05-03 16:18:32.809 I/mono-stdout(7960): at android.widget.AdapterView.removeAllViews(AdapterView.java:521)
05-03 16:18:32.809 I/mono-stdout(7960): at cirrious.mvvmcross.binding.droid.binders.MvxBindingLayoutInflatorFactory.n_onCreateView(Native Method)
05-03 16:18:32.809 I/mono-stdout(7960): at cirrious.mvvmcross.binding.droid.binders.MvxBindingLayoutInflatorFactory.onCreateView(MvxBindingLayoutInflatorFactory.java:29)
05-03 16:18:32.809 I/mono-stdout(7960): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:669)
05-03 16:18:32.809 I/mono-stdout(7960): at android.view.LayoutInflater.rInflate(LayoutInflater.java:739)
05-03 16:18:32.809 I/mono-stdout(7960): at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
05-03 16:18:32.809 I/mono-stdout(7960): at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
05-03 16:18:32.809 I/mono-stdout(7960): at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
05-03 16:18:32.809 I/mono-stdout(7960): at gridviewbug.droid.views.FirstView.n_onCreate(Native Method)
05-03 16:18:32.809 I/mono-stdout(7960): at gridviewbug.droid.views.FirstView.onCreate(FirstView.java:28)
05-03 16:18:32.809 I/mono-stdout(7960): at android.app.Activity.performCreate(Activity.java:4465)
05-03 16:18:32.809 I/mono-stdout(7960): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
05-03 16:18:32.809 I/mono-stdout(7960): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
05-03 16:18:32.809 I/mono-stdout(7960): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
05-03 16:18:32.809 I/mono-stdout(7960): at android.app.ActivityThread.access$600(ActivityThread.java:123)
05-03 16:18:32.809 I/mono-stdout(7960): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
05-03 16:18:32.809 I/mono-stdout(7960): at android.os.Handler.dispatchMessage(Handler.java:99)
05-03 16:18:32.809 I/mono-stdout(7960): at android.os.Looper.loop(Looper.java:137)
05-03 16:18:32.809 I/mono-stdout(7960): at android.app.ActivityThread.main(ActivityThread.java:4424)
05-03 16:18:32.809 I/mono-stdout(7960): at java.lang.reflect.Method.invokeNative(Native Method)
05-03 16:18:32.809 I/mono-stdout(7960): at java.lang.reflect.Method.invoke(Method.java:511)
05-03 16:18:32.809 I/mono-stdout(7960): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
05-03 16:18:32.809 I/mono-stdout(7960): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
05-03 16:18:32.809 I/mono-stdout(7960): at dalvik.system.NativeStart.main(Native Method)
Cosa sto facendo male? Sto usando le ultime cose che posso ottenere da Nuget. In esecuzione su Mono Android 4.6.4 in VS2012
Ecco il repo con il codice completo: https://github.com/sschoeb/MvvmCrossGridViewProblem
Ok grazie, cercheremo una correzione e creeremo una richiesta di pull. – Stefan
Ciao Stefan. Penso che tu avessi ragione (ho sbagliato) e la correzione generale è di basare 'MvxGridView' sul modello' MvxListView' piuttosto che su 'MvxLinearLayout'. Ieri mi sono confuso perché il mio test rapido ha mostrato un errore anche in 'MvxLinearLayout' - ma penso che sia stato solo Xamarin.Android non ha aggiornato la versione implementata del codice:/La versione fissa è https://gist.github.com/slodge/5518288 - ma ci vorranno un paio di giorni prima che questo affiori nelle distribuzioni di nuget (altre modifiche al QA) – Stuart