2014-02-05 2 views
0

MvxGridView 용 사용자 지정 어댑터를 구현해야합니다.MvxGridView 용 사용자 지정 어댑터

이 어댑터는 바인드 된 유형에 따라보기를 확장하고 이미지 자원을 설정해야합니다.

GetViewMvxAdapter에 그냥 무시할 수 있습니까?

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를 오버라이드 (override) 할 필요가? 정말 부모 뷰 그룹이없는 인플레이션에 대처하는 방법을 알고하지 않는 경우

...

답변

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 어댑터 동작을 무시하려면이 옵션을 재정의하십시오. MvvmCross 추가

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

방법은 - 단지 현재 행에 대해 미리 선택된 ItemTemplateId의 기본 Java 메소드에 매개 변수를 추가합니다. 이 GetView 내에서 호출되며, 그 중 하나가 새로운를 생성 - 당신이 전반적으로 일반적으로 AXML local:MvxItemTemplate에서 포착 된 미리 정의 된 ItemTemplateId를 제외한 모든 MvvmCross 어댑터 동작 (MvvmCross 추가하는 방법은

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

결합 할 경우,이 메소드를 오버라이드 (override) 보기 또는 convertView 사용하고 바인딩 오른쪽 DataContext 세트를 가지고 있는지 확인합니다. 당신이 MvvmCross이 목록 항목보기를 얻고 자신의 데이터 컨텍스트로 결합하는 방식을 대체하려면이 메소드를 오버라이드 (override)합니다. 있습니다

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

두 가지 방법을 만드는 데 사용 0 일 때 뷰를 바인드합니다. ItemTempateId (즉, 템플릿 없음)이 제공되었습니다. 이 경우 일반적으로 간단한 TextView이 표시되고 Text은 DataContext의 ToString으로 설정된 OneTime으로 가정합니다. 당신이 사용하지 않고 당신이 원하는 특별한 무언가가있는 경우,이 메소드를 오버라이드 (override) ItemTemplate을의

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

는 데이터 바인딩의 DataContext는 데이터 컨텍스트로 설정되어있다 (convertView 또는 재사용) templateId에서에서 팽창보기를 얻기 위해 사용되는 방법.

내부적 convertView 재사용이 방법을 사용

protected virtual void BindBindableView(object source, IMvxListItemView viewToUse) 

되는 소스 viewToUse 간단한 세트 DataContext를한다.

convertView이 방법을 재사용 할 수없는 경우에 대한

는 사용 : 이미 설정된의 DataContext에 새로운 뷰를 돌려줍니다

protected virtual IMvxListItemView CreateBindableView(object dataContext, int templateId) 

합니다.재정의 할


은 사용 사례에 따라 달라집니다 ... 그리고 당신의 후 질문의 방법에서, 나는 당신의 유스 케이스가 무엇인지 확실하지 않다.

개인적으로 가장 많이 사용되는 경우는 다른 객체에 다른 templateId를 사용하는 것입니다. https://github.com/MvvmCross/MvvmCross-Tutorials/blob/master/Working%20With%20Collections/Collections.Droid/Views/PolymorphicListItemTypesView.cs#L42

: 당신은 "모음 작업"샘플에서 볼 수

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

: 나는 일반적으로 같은과 GetBindableView를 오버라이드 (override)하는 것을 달성하기 위해

관련 문제