Xamarin.android 项目单击查看MvxLinearLayout?MvvmCross 5
我使用线程中描述的以下代码在ListView中单击LinearLayout时执行事件。它过去工作得很好,但在更新到MvvmCross 5之后,它不再工作了,因为mvxDataConsumer在解析到IMvxDataConsumer时变为null,我无法找出原因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
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