2014-01-09 57 views
1

我在我的MvvmCross PCL中有一个viewModel,它包含一个MyClass的列表。 并且这个MyClass包含一个int类型的成员,称为ResponseId。 我想创建一个listView的自定义布局,其中每个listItem包含不同的控件(例如,ratingBar,RadioButton等)的ResponseId取决于该ListItem的ResponseId的值。 如何设计listItem的布局?MvvmCross中的listView自定义布局

[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

我指的是你告诉@Stuart先生的同样的例子。 https://github.com/MvvmCross/MvvmCross-Tutorials/tree/master/Working%20With%20Collections – Suraj

回答

2

有多态性名单中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而不是源类型。

+0

但它给错误在一行list.Adapter =新的CustomAdapter(this,(IMvxAndroidBindingContext)BindingContext);并且错误是不能从'Cognition.IForIndia.Droid.Views转换为Cirrious.MvvmCross.Binding.Droid.BindingContext.IMvxAndroidBindingContext – Suraj

+0

我已经通过替换list.Adapter = new CustomAdapter(this,IMvxAndroidBindingContext)BindingContext)解决了这个问题;与list.Adapter =新的CustomAdapter(这作为IMvxAndroidBindingContext,BindingContext作为IMvxAndroidBindingContext);但是现在它什么也没有显示 – Suraj

+1

请尝试在您的问题中提供更多信息,并尽量避免在评论中提供部分代码片段。理解包含导致问题的代码的问题通常会更容易理解。提供完整的工作代码使答复者的工作变得特别容易。在撰写问题或评论时,如果您想象自己是回答问题的人,这可能会有所帮助 - 希望信息能帮助您回答问题吗?有关更多提示,请参阅http://msmvps.com/blogs/jon_skeet/archive/2010/08/29/writing-the-perfect-question.aspx – Stuart