Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xamarin.android 项目单击查看MvxLinearLayout?MvvmCross 5_Xamarin.android_Mvvmcross - Fatal编程技术网

Xamarin.android 项目单击查看MvxLinearLayout?MvvmCross 5

Xamarin.android 项目单击查看MvxLinearLayout?MvvmCross 5,xamarin.android,mvvmcross,Xamarin.android,Mvvmcross,我使用线程中描述的以下代码在ListView中单击LinearLayout时执行事件。它过去工作得很好,但在更新到MvvmCross 5之后,它不再工作了,因为mvxDataConsumer在解析到IMvxDataConsumer时变为null,我无法找出原因 public class MvxClickableLinearLayout : MvxLinearLayout { public MvxClickableLinearLayout(Context context, IAttribu

我使用线程中描述的以下代码在ListView中单击LinearLayout时执行事件。它过去工作得很好,但在更新到MvvmCross 5之后,它不再工作了,因为mvxDataConsumer在解析到IMvxDataConsumer时变为null,我无法找出原因

public class MvxClickableLinearLayout : MvxLinearLayout
{
    public MvxClickableLinearLayout(Context context, IAttributeSet attrs)
        : this(context, attrs, new MvxClickableLinearLayoutAdapter(context))
    {
    }

    public MvxClickableLinearLayout(Context context, IAttributeSet attrs, MvxClickableLinearLayoutAdapter adapter)
        : base(context, attrs, adapter)
    {
        var mvxClickableLinearLayoutAdapter = Adapter as MvxClickableLinearLayoutAdapter;
        if (mvxClickableLinearLayoutAdapter != null)
        {
            mvxClickableLinearLayoutAdapter.OnItemClick = OnItemClick;
        }
    }

    public ICommand ItemClick { get; set; }

    public void OnItemClick(object item)
    {
        if (ItemClick != null && ItemClick.CanExecute(item))
        {
            ItemClick.Execute(item);
        }
    }
}

public class MvxClickableLinearLayoutAdapter : MvxAdapterWithChangedEvent, View.IOnClickListener
{
    public delegate void ItemClickDelegate(object item);

    public ItemClickDelegate OnItemClick;

    public MvxClickableLinearLayoutAdapter(Context context)
        : base(context)
    {
    }

    public void OnClick(View view)
    {
        var mvxDataConsumer = view as IMvxDataConsumer;

        if (mvxDataConsumer != null && OnItemClick != null)
        {
            OnItemClick(mvxDataConsumer.DataContext);
        }
    }

    protected override View GetView(int position, View convertView, ViewGroup parent, int templateId)
    {
        View view = base.GetView(position, convertView, parent, templateId);
        view.SetOnClickListener(this);
        return view;
    }
}
axml:


我自己也有同样的问题,无法找到问题的根源,所以这里是我的工作。将每个视图的标记设置为我们已经跳过的GetView中的位置,然后使用该标记从适配器中获取项目,单击:

  protected override Android.Views.View GetView(int position, Android.Views.View convertView, Android.Views.ViewGroup parent, int templateId)
    {
        var view = base.GetView(position, convertView, parent, templateId);
        view.SetOnClickListener(this);
        view.Tag = position;
        return view;
    }

    #region IOnClickListener Members

    public void OnClick(Android.Views.View v)
    {

        var id = (int)v.Tag;

        var item = this.GetRawItem(id);

        if (item != null && OnItemClick != null)
            OnItemClick(item);

        // Old Code - no longer working
        //    IMvxDataConsumer dataConsumer = v as IMvxDataConsumer;

        //    if (dataConsumer != null && OnItemClick != null)
        //        OnItemClick(dataConsumer.DataContext);

    }
    #endregion

MvxClickableLinearLayoutAdapter
类中的
OnClick
方法中,更改:

var mvxDataConsumer=查看为IMvxDataConsumer;
致:

var mvxDataConsumer=view?.Tag作为IMvxDataConsumer;


现在应该可以了。在MvvmCross 5中,它现在是一个视图保持器,而不是视图本身。

能否在MvxLinearLayout设置适配器的位置添加代码行?
  protected override Android.Views.View GetView(int position, Android.Views.View convertView, Android.Views.ViewGroup parent, int templateId)
    {
        var view = base.GetView(position, convertView, parent, templateId);
        view.SetOnClickListener(this);
        view.Tag = position;
        return view;
    }

    #region IOnClickListener Members

    public void OnClick(Android.Views.View v)
    {

        var id = (int)v.Tag;

        var item = this.GetRawItem(id);

        if (item != null && OnItemClick != null)
            OnItemClick(item);

        // Old Code - no longer working
        //    IMvxDataConsumer dataConsumer = v as IMvxDataConsumer;

        //    if (dataConsumer != null && OnItemClick != null)
        //        OnItemClick(dataConsumer.DataContext);

    }
    #endregion