繁体   English   中英

我将MvxListview与ItemClick一起使用时应用崩溃

[英]App crash when I'm using MvxListview with ItemClick

我正在使用MvxListView并尝试将Command绑定到ItemClick事件,但是当我将ItemClick放入local:MvxBind属性时,我的应用程序在打开包含MvxListView的页面时崩溃。 如果我不在local:MvxBind中使用ItemClick,则MvxListView可以工作,但是如果我使用ItemClick,则在打开MvxListView页面时,应用程序将崩溃。

我的页面布局:

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

我的ListItem布局:

<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" />

我的活动:

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

我的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        
}

StackTrace:

05/04 10:27:03.407 W / Art(16616):JNI RegisterNativeMethods:尝试为mvvmcross.binding.droid.views.MvxListView注册0本机方法05-04 10:27:03.501 D / Mono(16616):组装Ref addref MvvmCross.Binding.Droid [0xb7205c70]-> System.Core [0xb731d880]:8 05-04 10:27:03.538 D / Mono(16616):程序集ref addref MvvmCross.Platform [0xb720b670]-> System.ObjectModel [ 0xb7226c78]:4 05-04 10:27:03.543 D / Mono(16616):程序集引用addref MvvmCross.Binding [0xb7204c50]-> System.Threading [0xb723c4b0]:3 05-04 10:27:03.580 D / Mono( 16616):程序集引用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):在<0xffffffff> 05-04 10:27:03.664 E / mono-rt(16616):在(包装管理-to-native)object.wrapper_native_0xb4f7f4c9(intptr,intptr,intptr,intptr,Android.Runtime.JValue *)05-04 10:27:03.664 E / mono-rt(16616):at(包装代理委托调用).invoke_in tptr_intptr_intptr_intptr_intptr_JValue *(intptr,intptr,intptr,intptr,Android.Runtime.JValue *)05-04 10:27:03.664 E / mono-rt(16616):在Android.Runtime.JNIEnv.CallNonvirtualObjectMethod(intptr,intptr, /Users/builder/data/lanes/2970/46c3f7e0/source/monodroid/src/Mono.Android/src/Runtime/JNIEnv.g.cs:612 05-04 10中的Android.Runtime.JValue *)[0x00060]: 27:03.664 E / mono-rt(16616):在/ Users / builder / data / lanes / 2970 / 46c3f7e0 / source /中的Android.Views.LayoutInflater.Inflate(int,Android.Views.ViewGroup,bool)[0x0009f] monodroid / src / Mono.Android / platforms / android-21 / src / generation / Android.Views.LayoutInflater.cs:689 05-04 10:27:03.664 E / mono-rt(16616):位于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.MvxAndroidBindi ngContext.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):位于MvvmCross.Binding.Droid.BindingContext.MvxBindingContextOwnerExtensions.BindingInflate(MvvmCross.Binding.BindingContext.IMvxBindingContextOwner,int,Android.Views.ViewGroup)05- 04 10:27:03.665 E / mono-rt(16616):在MvvmCross.Droid.Views.MvxActivity.SetContentView(int)05-04 10:27:03.665 E / mono-rt(16616):在PROSPERI_EpmFast.Droid。 C:\\ Projetos \\ PROSPERI_EpmFast \\ PROSPERI_EpmFast.Droid \\ Views \\ Activities \\ ProjectMyTasksView.cs:25 05-04 10:27:03.665 E / mono-中的Views.Activities.ProjectMyTasksView.OnCreate(Android.OS.Bundle)[0x00009] rt(16616):位于Android.App.Activity.n_OnCreate_Landroid_os_Bundle_(intptr,intptr,intptr)[0x00011] /Users/builder/data/lanes/2970/46c3f7e0/source/monodroid/src/Mono.Android/platforms/android -21 / SRC /生成/雄激素 id.App.Activity.cs:2707 05-04 10:27:03.666 E / mono-rt(16616):at(包装动态方法)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):尝试原生Android stacktrace:05-04 10:27:03.666 E / mono-rt(16616) :05-04 10:27:03.680 E / mono-rt(16616):在??? + 3069880740 [0xa20db790] 05-04 10:27:03.693 E / mono-rt(16616):在??? + 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):在执行本机代码时得到了SIGSEGV。 这通常表示05-04 10:27:03.703 E / mono-rt(16616):Mono运行时或本地库之一05-04 10:27:03.703 E / mono-rt(16616)中的致命错误:由您的应用程序使用。

问题是,您有无限的递归:

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

您必须返回_itemClickCommand而不是ItemClickCommand 我个人不喜欢这个_xyz ?? new XYZ(); _xyz ?? new XYZ(); 符号。 由于C#6,我更喜欢只读属性:

public MvxCommand ItemClickCommand { get; }

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

不太确定这是否是问题所在,但您不需要SelectedTask属性,因为您可以将其传递给ItemClicked方法:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM