2013-05-03 2 views
5

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

risposta

1

Dal Tracem appare come un insetto straight-forward, probabilmente una regressione che si è verificato qualche parte, mentre un altro problema di fissaggio .

La soluzione migliore sarebbe di aprire un problema per questo su GitHub - https://github.com/slodge/MvvmCross/issues/new? O potresti biforcare il sorgente e sistemarlo nel tuo ramo.


Nel frattempo, provare a utilizzare MvxListView? O creare un nuovo ViewGroup associabile?

+0

Ok grazie, cercheremo una correzione e creeremo una richiesta di pull. – Stefan

+1

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