13

Ich transformiere meine ListView zu RecyclerView mit Support-Bibliothek v7.Position in onCreateViewHolder erhalten

Ich habe 2 verschiedene Layouts in einem RecyclerView laden. In ListView bekam ich die Position des Artikels in der getView() Methode und in der Lage, ein entsprechendes Layout für diese Zeile zu laden. Aber in RecyclerView hat die onCreateViewHolder nicht den Positionsparameter.

Gibt es einen anderen Weg, dies zu erreichen?

PS: Die Inbox App von Google zeigt verschiedene Layouts in einer RecyclerView (könnte sein). Ich glaube nicht, sie könnten wegen der Leistungsverbesserungen, die ListView verwendet haben in RecyclerView

@Override 
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { 
     View v=null; 

      MyVO vo = voList.get(???POSITION???); 

      switch(vo.getType()){ 
       case TYPE_1: 
        v = LayoutInflater.from(viewGroup.getContext()) 
          .inflate(R.layout.layout1, viewGroup, false); 
        break; 
       case TYPE_2: 
        v = LayoutInflater.from(viewGroup.getContext()) 
          .inflate(R.layout.layout2, viewGroup, false); 
        break; 
      } 
     return new ViewHolder(v); 
    } 
+0

Ihr zweiter Parameter ist 'viewType', ich denke es ist was Sie wollen. – rom4ek

+0

Das habe ich auch zuerst gedacht. Aber es ist nicht. Es ist nur die Art der Ansicht und nicht die Position. – Sathesh

+0

eine andere Denkweise: switch (viewType) statt vo.getType() –

Antwort

32

Erstens außer Kraft setzen getItemViewType Methode:

@Override 
public int getItemViewType(int position) { 
    //Implement your logic here 
    MyVO vo = voList.get(position); 
    return vo.getType(); 
} 

Dann können Sie einfach den zweiten Parameter der onCreateViewHolder verwenden:

@Override 
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { 
    View v=null; 

     switch(viewType){ 
      case TYPE_1: 
       v = LayoutInflater.from(viewGroup.getContext()) 
         .inflate(R.layout.layout1, viewGroup, false); 
       break; 
      case TYPE_2: 
       v = LayoutInflater.from(viewGroup.getContext()) 
         .inflate(R.layout.layout2, viewGroup, false); 
       break; 
     } 
    return new ViewHolder(v); 
} 
+0

Ja. Es klappt. Das Problem ist jedoch, dass nach dem Aufruf von notifyDataSetChanged() die Elemente von layout1 null werden und nur die Elemente von layout2 im onBindViewHolder() verfügbar sind. – Sathesh

+0

Das funktioniert definitiv, ist aber keine gute Lösung, wenn mehrere Datenelemente zu demselben gehören Ansichtsart (zum Beispiel in einer Situation, in der eine Kopfzeile und eine Fußzeile um eine Liste herum hinzugefügt werden müssen) Ich möchte keine Fälle für jedes Element in der Liste erstellen, da alle derselben Ansichtsart angehören. – user1841702