2017-06-01 64 views
2

我使用线程this中描述的以下代码在ListView中单击LinearLayout时执行事件。它曾经完美地工作,但在更新到MvvmCross 5之后,它不再工作了,因为mvxDataConsumer在解析为IMvxDataConsumer时变为空,我找不到原因?ItemClick for MvxLinearLayout? MvvmCross 5

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:

<Controls.MvxClickableLinearLayout 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    local:MvxBind="ItemsSource Items;ItemClick GoToCommand" 
    local:MvxItemTemplate="@layout/main_list_item" /> 
+0

您可以添加用于设置MvxLinearLayout适配器的代码行吗? – nmilcoff

回答

1

有同样的问题我自己,不能得到它的底部,所以这是我的工作周围。设置每个视图它在,我们已经overidden的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 
1

在你OnClick方法MvxClickableLinearLayoutAdapter类,更改: var mvxDataConsumer = view as IMvxDataConsumer; 到: var mvxDataConsumer = view?.Tag as IMvxDataConsumer;

应该现在的工作。在MvvmCross 5中,它现在是一个视图持有者,而不是视图本身。