2014-01-09 53 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