1
votes

I'm using a MvxListView and trying to bind a Command to ItemClick event, but when I'm put ItemClick in local:MvxBind attribute, my app crash on open the page that contain the MvxListView. If I not use the ItemClick in local:MvxBind, the MvxListView work, but if I use ItemClick, when I open the MvxListView page, the app crash.

My page layout:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:local="http://schemas.android.com/apk/res-auto/PROSPERI_EpmFast.Droid"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">
    <RelativeLayout
        android:layout_width="0dip"
        android:layout_height="fill_parent"
        android:layout_weight="0.05" />
    <RelativeLayout
        android:layout_width="0dip"
        android:layout_height="fill_parent"
        android:layout_weight="0.9">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">
            <LinearLayout
                android:orientation="horizontal"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/linearLayout1">
                <TextView
                    android:id="@+id/headerTxtViewName"
                    android:text="@string/name"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="5dp"
                    android:gravity="left"
                    android:layout_weight="0.3"
                    android:textColor="@color/epmfast_vermelho" />
                <TextView
                    android:id="@+id/headerTxtViewStartDate"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="5dp"
                    android:text="@string/startDate"
                    android:gravity="left"
                    android:layout_weight="0.25"
                    android:textColor="@color/epmfast_vermelho" />
                <TextView
                    android:id="@+id/headerTxtViewFinishtDate"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="5dp"
                    android:text="@string/finishDate"
                    android:gravity="left"
                    android:layout_weight="0.2"
                    android:textColor="@color/epmfast_vermelho" />
                <TextView
                    android:id="@+id/headerTxtViewComplete"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="5dp"
                    android:text="@string/complete"
                    android:gravity="left"
                    android:layout_weight="0.01"
                    android:textColor="@color/epmfast_vermelho" />
            </LinearLayout>
            <View
                style="@style/Divider" />
            <LinearLayout
                android:orientation="horizontal"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:id="@+id/linearLayout2">
              <Mvx.MvxListView
                  android:id="@+id/lstViewTasks"
                  android:layout_width="fill_parent"
                  android:layout_height="fill_parent"
                  android:dividerHeight="1px"
                  android:clickable="true"
                  android:focusableInTouchMode="true"
                  android:choiceMode="singleChoice"
                  android:layout_alignParentTop="true"
                  local:MvxBind="ItemsSource Tasks, Mode=TwoWay; SelectedItem SelectedTask; ItemClick ItemClickCommand; "
                  local:MvxItemTemplate="@layout/projectmytasksitem" />
            </LinearLayout>
        </LinearLayout>
    </RelativeLayout>
    <RelativeLayout
        android:layout_width="0dip"
        android:layout_height="fill_parent"
        android:layout_weight="0.05" />
</LinearLayout>

My ListItem layout:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:local="http://schemas.android.com/apk/res-auto/PROSPERI_EpmFast.Droid"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/paddingDefaultItem"
android:paddingTop="@dimen/paddingDefaultItem">
<TextView
    android:id="@+id/txtViewNameValue"
    android:text="tarefa 1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    local:MvxBind="Text Name"
    android:gravity="left"
    android:layout_weight="0.18"
    android:textSize="@dimen/fontDefaultMicro" />
<TextView
    android:id="@+id/txtViewStartDateValue"
    android:text="01/01/1111"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    local:MvxBind="Text StartDate, Converter=DateTimeToString"
    android:gravity="left"
    android:layout_weight="0.18"
    android:textSize="@dimen/fontDefaultMicro" />
<TextView
    android:id="@+id/txtViewFinishtDateValue"
    android:text="01/01/1111"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    local:MvxBind="Text FinishDate, Converter=DateTimeToString"
    android:gravity="left"
    android:layout_weight="0.2"
    android:textSize="@dimen/fontDefaultMicro" />

My Activity:

public class ProjectMyTasksView : MvxActivity
{
    public new ProjectMyTasksViewModel viewModel
    {
        get { return (ProjectMyTasksViewModel)base.ViewModel; }
        set { base.ViewModel = value; }
    }        

    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        this.SetContentView(Resource.Layout.ProjectMyTasksView);
    }
}

My ViewModel:

public class ProjectMyTasksViewModel : MvxViewModel
{
    #region [Atributos privados]

    private ProjectService _service;

    #endregion

    #region [Propriedades]

    private IList<Task> _tasks;
    public IList<Task> Tasks
    {
        get { return _tasks; }
        set { _tasks = value; RaisePropertyChanged(() => Tasks); }
    }

    private bool _isListaVazia;
    public bool IsListaVazia
    {
        get { return _isListaVazia; }
        set { _isListaVazia = value; RaisePropertyChanged(() => IsListaVazia); }
    }

    private Task _selectedTask;
    public Task SelectedTask
    {
        get { return _selectedTask; }
        set { _selectedTask = value; RaisePropertyChanged(() => SelectedTask); }
    }        

    private string _mensagemErro;
    public string MensagemErro
    {
        get { return _mensagemErro; }
        set { _mensagemErro = value; RaisePropertyChanged(() => MensagemErro); }
    }

    #endregion

    #region [Commands]

    private MvxCommand _itemClickCommand;
    public MvxCommand ItemClickCommand
    {
        get
        {
            _itemClickCommand = _itemClickCommand ?? new MvxCommand(ExecuteItemClickCommand);
            return ItemClickCommand;
        }
    }

    #endregion

    #region [Construtores]

    public ProjectMyTasksViewModel()
    {
        _service = new ProjectService();
        this.CriaListaTeste();
        IsListaVazia = (Tasks.Count > 0) ? true : false;
    }

    #endregion

    #region [Execuções dos Comandos]

    public void ExecuteItemClickCommand()
    {
        var taskJson = Mvx.Resolve<IMvxJsonConverter>().SerializeObject(SelectedTask);

        this.ShowViewModel<TaskViewModel>(new TaskViewModel.Parametros { TaskJson = taskJson });
    }

    #endregion

    #region [Métodos]

    public void CriaListaTeste()
    {
        Tasks = new List<Task>();

        for (int indiceProjeto = 1; indiceProjeto <= 10; indiceProjeto++)
        {
            Tasks.Add(new Task { Name = $"Tarefa {indiceProjeto}", StartDate = DateTime.Now, FinishDate = DateTime.Now, IsCompleted = false });
        }
    }

    #endregion        
}

The StackTrace:

05-04 10:27:03.407 W/art (16616): JNI RegisterNativeMethods: attempt to register 0 native methods for mvvmcross.binding.droid.views.MvxListView 05-04 10:27:03.501 D/Mono (16616): Assembly Ref addref MvvmCross.Binding.Droid[0xb7205c70] -> System.Core[0xb731d880]: 8 05-04 10:27:03.538 D/Mono (16616): Assembly Ref addref MvvmCross.Platform[0xb720b670] -> System.ObjectModel[0xb7226c78]: 4 05-04 10:27:03.543 D/Mono (16616): Assembly Ref addref MvvmCross.Binding[0xb7204c50] -> System.Threading[0xb723c4b0]: 3 05-04 10:27:03.580 D/Mono (16616): Assembly Ref addref MvvmCross.Core[0xb7206b18] -> System.Threading[0xb723c4b0]: 4 05-04 10:27:03.664 E/mono-rt (16616): Stacktrace: 05-04 10:27:03.664 E/mono-rt (16616): 05-04 10:27:03.664 E/mono-rt (16616): at <0xffffffff> 05-04 10:27:03.664 E/mono-rt (16616): at (wrapper managed-to-native) object.wrapper_native_0xb4f7f4c9 (intptr,intptr,intptr,intptr,Android.Runtime.JValue*) 05-04 10:27:03.664 E/mono-rt (16616): at (wrapper delegate-invoke) .invoke_intptr_intptr_intptr_intptr_intptr_JValue* (intptr,intptr,intptr,intptr,Android.Runtime.JValue*) 05-04 10:27:03.664 E/mono-rt (16616): at Android.Runtime.JNIEnv.CallNonvirtualObjectMethod (intptr,intptr,intptr,Android.Runtime.JValue*) [0x00060] in /Users/builder/data/lanes/2970/46c3f7e0/source/monodroid/src/Mono.Android/src/Runtime/JNIEnv.g.cs:612 05-04 10:27:03.664 E/mono-rt (16616): at Android.Views.LayoutInflater.Inflate (int,Android.Views.ViewGroup,bool) [0x0009f] in /Users/builder/data/lanes/2970/46c3f7e0/source/monodroid/src/Mono.Android/platforms/android-21/src/generated/Android.Views.LayoutInflater.cs:689 05-04 10:27:03.664 E/mono-rt (16616): at MvvmCross.Binding.Droid.Views.MvxLayoutInflater.Inflate (int,Android.Views.ViewGroup,bool) 05-04 10:27:03.665 E/mono-rt (16616): at MvvmCross.Binding.Droid.BindingContext.MvxAndroidBindingContext.CommonInflate (int,Android.Views.ViewGroup,bool) 05-04 10:27:03.665 E/mono-rt (16616): at MvvmCross.Binding.Droid.BindingContext.MvxAndroidBindingContext.BindingInflate (int,Android.Views.ViewGroup,bool) 05-04 10:27:03.665 E/mono-rt (16616): at MvvmCross.Binding.Droid.BindingContext.MvxAndroidBindingContext.BindingInflate (int,Android.Views.ViewGroup) 05-04 10:27:03.665 E/mono-rt (16616): at MvvmCross.Binding.Droid.BindingContext.MvxBindingContextOwnerExtensions.BindingInflate (MvvmCross.Binding.BindingContext.IMvxBindingContextOwner,int,Android.Views.ViewGroup) 05-04 10:27:03.665 E/mono-rt (16616): at MvvmCross.Droid.Views.MvxActivity.SetContentView (int) 05-04 10:27:03.665 E/mono-rt (16616): at PROSPERI_EpmFast.Droid.Views.Activities.ProjectMyTasksView.OnCreate (Android.OS.Bundle) [0x00009] in C:\Projetos\PROSPERI_EpmFast\PROSPERI_EpmFast.Droid\Views\Activities\ProjectMyTasksView.cs:25 05-04 10:27:03.665 E/mono-rt (16616): at Android.App.Activity.n_OnCreate_Landroid_os_Bundle_ (intptr,intptr,intptr) [0x00011] in /Users/builder/data/lanes/2970/46c3f7e0/source/monodroid/src/Mono.Android/platforms/android-21/src/generated/Android.App.Activity.cs:2707 05-04 10:27:03.666 E/mono-rt (16616): at (wrapper dynamic-method) object.fdbd2d8f-d719-4bb8-a51e-764cdabaeb71 (intptr,intptr,intptr) 05-04 10:27:03.666 E/mono-rt (16616): at (wrapper native-to-managed) object.fdbd2d8f-d719-4bb8-a51e-764cdabaeb71 (intptr,intptr,intptr) 05-04 10:27:03.666 E/mono-rt (16616): 05-04 10:27:03.666 E/mono-rt (16616): Attempting native Android stacktrace: 05-04 10:27:03.666 E/mono-rt (16616): 05-04 10:27:03.680 E/mono-rt (16616): at ???+3069880740 [0xa20db790] 05-04 10:27:03.693 E/mono-rt (16616): at ???+3069880740 [0x0] 05-04 10:27:03.703 E/mono-rt (16616): 05-04 10:27:03.703 E/mono-rt (16616): ================================================================= 05-04 10:27:03.703 E/mono-rt (16616): Got a SIGSEGV while executing native code. This usually indicates 05-04 10:27:03.703 E/mono-rt (16616): a fatal error in the mono runtime or one of the native libraries 05-04 10:27:03.703 E/mono-rt (16616): used by your application.

2
Can you try to use MvxCommand<Task> instead of MvxCommand for the ItemClickCommand? Just an idea.Stefan Wanitzek

2 Answers

0
votes

Not too sure if this is the issue but you dont need the SelectedTask property, as you can pass that into your ItemClicked method:

public void ExecuteItemClickCommand(Task task)
{
    //Do stuff with task
    var taskJson = Mvx.Resolve<IMvxJsonConverter>().SerializeObject(task);
    this.ShowViewModel<TaskViewModel>(new TaskViewModel.Parametros { TaskJson = taskJson });
}

public IMvxCommand ItemClickCommand
{
    get
    {
        return new MvxCommand<Task> (ExecuteItemClickCommand);
    }
}
2
votes

The Problem is, that you have endless recursion:

private MvxCommand _itemClickCommand;
public MvxCommand ItemClickCommand
{
    get
    {
        _itemClickCommand = _itemClickCommand ?? new MvxCommand(ExecuteItemClickCommand);
        return ItemClickCommand;
    }
}

You have to return _itemClickCommand instead of ItemClickCommand. Personally, I don't like this _xyz ?? new XYZ(); notation. Since C# 6 I prefer readonly properties:

public MvxCommand ItemClickCommand { get; }

public MyClass()
{
    ItemClickCommand = MvxCommand(ExecuteItemClickCommand);
}