2013-05-03 1 views
5

Ce que je veux faire est un écran simple montrant plusieurs éléments dans une grille. Cela peut être facilement archivé sur Android en utilisant un GridView.Utiliser MvxGridView dans MvvmCross

Dans MvvmCross, je suppose que je dois utiliser MvxGridView pour archiver le même.

Voici mon 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> 

Le 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> 

Mon 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; } 
    } 
} 

Et voici ce qui se passe quand je lance cet exemple:

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) 

Qu'est-ce que je fais mal? J'utilise les dernières choses que je peux obtenir de Nuget. Fonctionnant sur Mono Android 4.6.4 dans VS2012

est ici le repo avec le code complet: https://github.com/sschoeb/MvvmCrossGridViewProblem

Répondre

1

De l'tracem il ressemble à un bug droit vers l'avant, sans doute une régression qui a eu lieu quelque part en fixant une autre question .

Votre meilleur pari serait d'ouvrir un problème pour cela sur GitHub - https://github.com/slodge/MvvmCross/issues/new? Ou vous pouvez fourchonner la source et la réparer dans votre branche.


En attendant, essayez peut-être d'utiliser MvxListView? Ou créer un nouveau ViewGroup pouvant être lié?

+0

Ok merci, ira pour un correctif et créer une demande de traction. – Stefan

+1

Salut Stefan. Je pense que vous aviez raison (j'avais tort) et la solution générale est de baser 'MvxGridView' sur le modèle' MvxListView' plutôt que sur 'MvxLinearLayout'. Je suis confus hier parce que mon test rapide a montré une erreur aussi dans 'MvxLinearLayout' - mais je pense que c'était juste Xamarin.Android ne pas mettre à jour la version déployée du code:/La version fixe est https://gist.github.com/slodge/5518288 - mais il faudra quelques jours avant que cela ne se produise dans les déploiements de nuget (autres changements au QA) – Stuart

Questions connexes