2014-02-05 2 views
0

Я должен реализовать пользовательский адаптер для MvxGridView.Пользовательский адаптер для MvxGridView

Этот адаптер должен, в зависимости от типа привязки, раздуть представление и установить ресурс изображения.

Могу ли я просто переопределить GetView в MvxAdapter?

public override View GetView(int position, View convertView, ViewGroup parent) 
{ 
    var inflater = (LayoutInflater)this.Context.GetSystemService(Context.LayoutInflaterService); 
    var productNode = (ProductNode)this.GetRawItem(position); 
    if (productNode.NodeType == ProductNodeType.Folder) 
    { 
     return inflater.Inflate(Resource.Layout.GridFolderItem, parent); 
    } 
    else 
    { 
     View documentItemView = inflater.Inflate(Resource.Layout.GridDocumentItem, parent); 
     var imageView = documentItemView.FindViewById<MvxImageView>(Resource.Layout.GridFolderItem); 

     switch (productNode.NodeType) 
     { 
      case ProductNodeType.Unknown: 
       throw new InvalidOperationException("Node type hasn't been initialized"); 

      case ProductNodeType.Image: 
       // Set matching image 
       break; 
      case ProductNodeType.Pdf: 
       break; 
      case ProductNodeType.Parts: 
       break; 

      default: 
       throw new InvalidOperationException(
        string.Format("Unhandled node type '{0}'", productNode.NodeType)); 
     } 

     return imageView; 
    } 
} 

Или я должен переопределить GetBindableView?

В этом случае я не знаю, как бороться с инфляцией без родительского ViewGroup ...

ответ

2

Источником MvxAdpater в https://github.com/MvvmCross/MvvmCross/blob/v3.1/Cirrious/Cirrious.MvvmCross.Binding.Droid/Views/MvxAdapter.cs

В GetView методы в основном являются:

public override View GetView(int position, View convertView, ViewGroup parent) 

метод, который вызывает Java ListView. Переопределите это, если вы хотите переопределить все поведение адаптера MvvmCross.

protected virtual View GetView(int position, View convertView, ViewGroup parent, int templateId) 

Способ добавляют MvvmCross - просто добавляет параметр метода Java по умолчанию для предварительно выбранного ItemTemplateId для текущей строки. Override, если вы хотите, чтобы в целом все поведение MvvmCross Adapter кроме предопределенного ItemTemplateId (который, как правило, взял из AXML local:MvxItemTemplate связывания

protected virtual View GetBindableView(View convertView, object dataContext, int templateId) 

метод добавлен MvvmCross - это называется в GetView и он либо создает новый вид или использует convertView и затем убеждается, что связывание имеет право DataContext набора. Override, если вы хотите заменить путь MvvmCross получает список представлений элементов и связывает их в контекст данных.

protected virtual void BindSimpleView(View convertView, object dataContext) 
protected virtual View GetSimpleView(View convertView, object dataContext) 

Два метода, которые используется для создания и связывать представления, когда нуль ItemTempateId (т.е. без шаблона). В этом случае мы обычно предполагаем, что показан простой TextView, и это Text, тогда OneTime устанавливается в ToString DataContext. Перекрыть это, если у вас есть что-то особенное вы хотите сделать без использования ItemTemplate-х

protected virtual View GetBindableView(View convertView, object dataContext, int templateId) 

Метод, используемый, чтобы получить представление надувать из templateId (или повторно использовать из convertView), который имеет это привязки данных DataContext устанавливается в DataContext.

Внутренне для convertView повторного использования этот метод использует:

protected virtual void BindBindableView(object source, IMvxListItemView viewToUse) 

, который просто устанавливает значение DataContext на viewToUse к источнику.

и для случая, когда convertView не может быть повторно использован этот метод использует:

protected virtual IMvxListItemView CreateBindableView(object dataContext, int templateId) 

, который возвращает совершенно новый вид с его DataContext уже установлен.


Что вы хотите переопределить зависит от случая использования ... и от метода в вашем quesiton, я не уверен, что ваш случай использования.

Лично мой самый распространенный вариант использования - просто использовать разные templateId для разных объектов. Для того, чтобы добиться того, что я вообще переопределить GetBindableView что-то вроде:

protected override View GetBindableView(View convertView, object dataContext, int templateId) 
    { 
     if (SomePredicate(dataContext)) 
      templateId = Resource.Layout.ListTemplateId1; 
     else if (SomeOtherPredicate(dataContext)) 
      templateId = Resource.Layout.ListTemplateId2; 
     else if (SomeOtherOtherPredicate(dataContext)) 
      templateId = Resource.Layout.ListTemplateId3; 

     return base.GetBindableView(convertView, dataContext, templateId); 
    } 

Вы можете увидеть это в «Работа с коллекциями» образца: https://github.com/MvvmCross/MvvmCross-Tutorials/blob/master/Working%20With%20Collections/Collections.Droid/Views/PolymorphicListItemTypesView.cs#L42

Смежные вопросы