如何为 `MvxLinearLayout` 绑定到 `ItemClick`?
How do I bind to `ItemClick` for a `MvxLinearLayout`?
我有一个 ScrollView
,它最初包含两个 MvxListView
控件。
虽然 Android 不支持 ScrollView
中的 ListView
控件,但这是有道理的,因为它们都试图填充 parent 高度并提供他们自己的滚动逻辑。
我想要的是两个不可滚动的列表,它们的完整高度在我的 ScrollView
中。 ListView
which MvxListView
extends 不支持这个,除非手动修改高度。
我想要这个的原因是因为我有两个单独的列表,我将它们绑定到不同的源并且它们都有自己的 header。我需要所有这些都可以在一个 ScrollView
.
内滚动
然后我发现 MvxLinearLayout
是一个可绑定的 LinearLayout
,它有一个 ItemSource
属性 我可以绑定到。它工作得很好,它显示我的项目并获得所有项目的完整高度,因此我可以在我的 ScrollView
中滚动我的两个列表。问题是它似乎没有 ItemClick
属性,所以我没有办法从我的列表中获取用户输入。
有谁知道以可绑定的方式执行此操作的简洁方法?我不想在后面的代码中附加 onItemClick
处理程序。是否有另一个 MvvmCross 控件可以做我想做的事情?
您需要为布局内的单独项目添加点击绑定。
您可以像这样向任何布局添加点击:
<RelativeLayout
android:background="?android:attr/selectableItemBackground"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/relativeLayout1"
local:MvxBind="Click SomeCommand">
您是否尝试过为 MvxLinearLayout 指定项目模板?例如,local:MvxItemTemplate="@layout/item_template"
?您可以在要处理点击的控件上的项目模板内设置 MvvmCross Click 绑定。
您可以扩展 MvxLinearLayout 以支持 ItemClick
:
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;
}
}
现在您可以像绑定 ListView
一样绑定到 ItemClick
:
local:MvxBind="ItemClick SomeCommand"
我有一个 ScrollView
,它最初包含两个 MvxListView
控件。
虽然 Android 不支持 ScrollView
中的 ListView
控件,但这是有道理的,因为它们都试图填充 parent 高度并提供他们自己的滚动逻辑。
我想要的是两个不可滚动的列表,它们的完整高度在我的 ScrollView
中。 ListView
which MvxListView
extends 不支持这个,除非手动修改高度。
我想要这个的原因是因为我有两个单独的列表,我将它们绑定到不同的源并且它们都有自己的 header。我需要所有这些都可以在一个 ScrollView
.
然后我发现 MvxLinearLayout
是一个可绑定的 LinearLayout
,它有一个 ItemSource
属性 我可以绑定到。它工作得很好,它显示我的项目并获得所有项目的完整高度,因此我可以在我的 ScrollView
中滚动我的两个列表。问题是它似乎没有 ItemClick
属性,所以我没有办法从我的列表中获取用户输入。
有谁知道以可绑定的方式执行此操作的简洁方法?我不想在后面的代码中附加 onItemClick
处理程序。是否有另一个 MvvmCross 控件可以做我想做的事情?
您需要为布局内的单独项目添加点击绑定。 您可以像这样向任何布局添加点击:
<RelativeLayout
android:background="?android:attr/selectableItemBackground"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/relativeLayout1"
local:MvxBind="Click SomeCommand">
您是否尝试过为 MvxLinearLayout 指定项目模板?例如,local:MvxItemTemplate="@layout/item_template"
?您可以在要处理点击的控件上的项目模板内设置 MvvmCross Click 绑定。
您可以扩展 MvxLinearLayout 以支持 ItemClick
:
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;
}
}
现在您可以像绑定 ListView
一样绑定到 ItemClick
:
local:MvxBind="ItemClick SomeCommand"