MvvmCross中listView的自定义布局

时间:2014-01-09 05:50:54

标签: mvvmcross

我的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);
        }

    }
}

1 个答案:

答案 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而不是源类型进行视图选择。