我的MvvmCross PCL中有一个viewModel,其中包含 MyClass 列表。 这个MyClass包含一个名为 ResponseId 的int类型的成员。 我想为listView创建一个自定义布局,其中每个listItem包含ResponseId的不同控件(例如,ratingBar,RadioButton等),具体取决于该listItem的ResponseId的值。 如何为listItem设计布局?
[Activity(Label = "View for MetricsByCat2ViewModel")]
public class MetricsByCat2View : MvxActivity
{
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.MetricsByCat2View);
}
protected override void OnViewModelSet()
{
SetContentView(Resource.Layout.MetricsByCat2View);
var list = FindViewById<MvxListView>(Resource.Id.TheListView);
TextView tv = FindViewById<TextView>(Resource.Id.tv);
try
{
list.Adapter = new CustomAdapter(this as IMvxAndroidBindingContext,
BindingContext as IMvxAndroidBindingContext);
}
catch (Exception e)
{
tv.Text = e.Message;
}
}
public class CustomAdapter : MvxAdapter
{
public CustomAdapter(IMvxAndroidBindingContext context,
IMvxAndroidBindingContext bindingContext)
: base((Android.Content.Context)context, bindingContext)
{
}
public override int GetItemViewType(int position)
{
var item = GetRawItem(position);
if (item is StarRating)
return 1;
return 0;
}
public override int ViewTypeCount
{
get { return 2; }
}
protected override View GetBindableView(View convertView, object source,
int templateId)
{
if (source is StarRating)
templateId = Resource.Layout.item_met2;
// else if (source is Dog)
// templateId = Resource.Layout.ListItem_Dog;
return base.GetBindableView(convertView, source, templateId);
}
}
}
答案 0 :(得分:3)
https://github.com/MvvmCross/MvvmCross-Tutorials/tree/master/Working%20With%20Collections中有一个多态列表示例 - 它使用自定义适配器,如:
public class CustomAdapter : MvxAdapter
{
public CustomAdapter(Context context, IMvxAndroidBindingContext bindingContext)
: base(context, bindingContext)
{
}
public override int GetItemViewType(int position)
{
var item = GetRawItem(position);
if (item is Kitten)
return 0;
return 1;
}
public override int ViewTypeCount
{
get { return 2; }
}
protected override View GetBindableView(View convertView, object source, int templateId)
{
if (source is Kitten)
templateId = Resource.Layout.ListItem_Kitten;
else if (source is Dog)
templateId = Resource.Layout.ListItem_Dog;
return base.GetBindableView(convertView, source, templateId);
}
}
在你的应用中,你需要做类似的事情 - 但是使用ResponseId
而不是源类型进行视图选择。