2013-05-03 7 views
5

Co chcę zrobić, to prosty ekran pokazujący wiele elementów w siatce. To na Androida może być zarchiwizowane za pomocą GridView.Korzystanie z MvxGridView w MvvmCross

W MvvmCross Myślę, że muszę użyć MvxGridView do archiwizacji to samo.

Oto moja 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> 

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> 

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

A oto, co się dzieje, kiedy uruchomić ten przykład:

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) 

Co robię źle? Używam najnowszych rzeczy, które mogę uzyskać od Nuget. Działa na Androidzie 4.6.4 Mono w VS2012

Oto repo z kompletnego kodu: https://github.com/sschoeb/MvvmCrossGridViewProblem

Odpowiedz

1

Z tracem wygląda jak prosta bug, chyba że wystąpił regres gdzieś podczas ustalania inny problem .

Twoim najlepszym rozwiązaniem byłoby otwarcie problemu dotyczącego GitHub - https://github.com/slodge/MvvmCross/issues/new? Możesz też rozwidlić źródło i naprawić je w swoim oddziale.


W międzyczasie, może spróbuj użyć MvxListView? Lub utworzyć nową powiązaną grupę ViewGroup?

+0

Dzięki, poproszę o poprawkę i utworzymy żądanie pobrania. – Stefan

+1

Cześć Stefan. Myślę, że masz rację (myliłem się), a ogólną poprawką jest oparcie 'MvxGridView' na szablonie' MvxListView' zamiast na 'MvxLinearLayout'. Wczoraj byłem zdezorientowany, ponieważ mój szybki test pokazał błąd również w 'MvxLinearLayout' - ale myślę, że to był po prostu Xamarin.Android nie zaktualizował wdrożonej wersji kodu:/Stała wersja to https://gist.github.com/slodge/5518288 - ale zajmie to kilka dni, zanim pojawi się w implementacjach nugetów (inne zmiany w kontroli jakości) – Stuart