0

habe ich eine Liste von folgendem Modell:RecyclerView Multiple Ansicht Typ

name 
categoryName 

Nun, ich habe eine recyclerview zu bauen, die Gruppen alle Einheiten mit dem gleichen category:

categoryName1 
    name1 
    name2 
    name3 
categoryName2 
    name4 
categoryName3 
    name5 
    name6 

So Ich habe zwei verschiedene Zeilentypen (verschiedene Stile). Die Liste ist geordnet. Ich brauche den Code nicht unbedingt, aber was ist der Algorithmus für den Adapter? Kann ich das mit nur einem Zyklus lösen?

Ich möchte vermeiden, Ansicht zu einem vertikalen LinearLayout von Code hinzuzufügen.

+0

Werfen Sie einen Blick auf https://stackoverflow.com/questions/26245139/how-to-create-recyclerview-with-multiple-view-type –

+0

Ich habe lese diese antwort, aber wenn ich die liste an den adapter anschließe und sie meine liste durchläuft, habe ich nicht zwei verschiedene arten von objekten. Wenn also ein KategorieName gerendert wird, bedeutet das, dass ich einen Namen überspringe. – Jumpa

Antwort

0

Sie müssen Methode überschreiben public int getItemViewType(int position) von RecyclerView und handhaben es in public void onCreateViewHolder(ViewGroup parent, int viewType)

Beispiel:

enum Type{Name,Category} 

@Override 
public int getItemViewType(int position) { 
    if (position == POSITION_CATEGORY_1 || position == POSITION_CATEGORY_2) { 
     return Type.Category; 
    } else { 
     return Type.Name;} 
    } 
} 

End binden:

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    if(viewType == Type.Category.ordinal()){ 
     return new CategoryItemView(...); 
    }else { 
     return new CommonItemView(...); 
    } 
} 
+0

Umh ... Ich kenne nicht die Anzahl der Kategorien noch wie viele Namen zu derselben Kategorie gehören. – Jumpa

+0

Was hast du? Wenn Sie eine Liste haben, können Sie Indizes in anderen list \ array speichern, wenn Sie sie füllen. –

2

Ihre Daten sollte wie folgt aussehen:

public class CategorizedName { 

    private Category category; 
    private Collection<Name> names = null; 

    public Category getCategory() { 
     return category; 
    } 

    public Collection<Name> getNames() { 
     return names; 
    } 

    // override hashCode and equals ... 
} 

In Ihrem Adapter sollten Sie etwas tun:

private static final int CATEGORY = 1; 
private static final int NAME = 2;  

private Collection<CategorizedName> data; 

@Override 
public int getItemViewType(int position) { 
    if (items.get(position) instanceof Category) { 
     return CATEGORY; 
    } else if (items.get(position) instanceof Name) { 
     return NAME; 
    } 
    throw new RuntimeException('error'); 
} 

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { 

    RecyclerView.ViewHolder viewHolder; 
    LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext()); 

    switch (viewType) { 
     case CATEGORY: 
      View categoryView = inflater.inflate(R.layout.viewholder_category, viewGroup, false); 
      viewHolder = new CategoryViewHolder(categoryView); 
      break; 
     case NAME: 
      View nameView = inflater.inflate(R.layout.viewholder_name, viewGroup, false); 
      viewHolder = new NameViewHolder(nameView); 
      break; 
    } 
    return viewHolder; 
} 

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) { 
     switch (viewHolder.getItemViewType()) { 
      case USER: 
       CategoryViewHolder categoryViewHolder = (CategoryViewHolder) viewHolder; 
       bindCategoryViewHolder(categoryViewHolder, position); 
       break; 
      case IMAGE: 
       NameViewHolder nameViewHolder = (NameViewHolder) viewHolder; 
       bindNameViewHolder(nameViewHolder, position); 
       break; 
     } 
} 

Vergessen Sie nicht Sicht Halter zu schaffen.

EDIT 1: hinzugefügt Datenstruktur für Adapter

+0

Im Moment habe ich eine einzigartige Liste des oben beschriebenen Modells. Also sollte ich eine temporäre Datenstruktur verwenden, um Kategorie --- MANY-> Namen zu speichern? – Jumpa

+0

@Jumpa Ich eddited Antwort. Hoffe das löst deine Frage. – TheKarlo95

+0

Ich habe Ihre Antwort aktualisiert, danke für Ihre Zeit. Trotzdem frage ich mich immer noch, ob ich das ohne eine unterstützende Datenstruktur machen kann. – Jumpa

Verwandte Themen