2016-11-22 3 views
0

So bin ich versucht, ein anderes Layout Ressource für mein erstes ListItem Element setzen Sie diesen Code verwenden:Einstellung Layout ersten Listview Artikel

int type; 
@Override 
public int getItemViewType(int position) { 

    if(position==0) { 
     type = R.layout.queue_item_next; 
    } else { 
     type = R.layout.queue_item; 
    } 

    return type; 
} 


@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    if(convertView == null) { 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = (View) inflater.inflate(getItemViewType(position), parent, false); 
    } 

Dieser Code funktioniert jedoch mit etwas unerwartetes Verhalten. Aus irgendeinem Grund wird das letzte Element der ListView auch auf dieses alternative Layout gesetzt und ich habe keine Ahnung warum.

Was könnte dazu führen, dass dies geschieht?

Danke.

+0

Vielleicht, weil '' convertView wird wiederverwendet zu verwenden. Entfernen Sie 'if' und überprüfen Sie, ob es funktioniert. – Sanjeet

+0

Ich bin mir nicht hundertprozentig sicher, aber ich denke, es hängt mit dem Recycling zusammen. Sie überprüfen derzeit, ob convertView null ist, aber ich denke, Sie müssen auch den aktuellen Typ der convertView überprüfen. Sie könnten das im Tag von convertView speichern, um diese Prüfung durchzuführen. – 0xDEADC0DE

+0

, aber das Hinzufügen der Prüfung auf convertView erhöht den Speicher, wenn die Anzahl der anzuzeigenden Elemente groß ist, was das Konzept der Wiederverwendungsansicht verletzt. – Swapnil

Antwort

0

Da Sie if(convertView == null) {} verwenden, bedeutet das, wenn vorherige Ansicht im Speicher verfügbar ist, verwenden Sie diese, andernfalls erstellen Sie eine neue. Also, manchmal auf Scrollen schnell/langsam hängt von verfügbaren Ressourcen des Telefons variiert.

dieses Problem zu lösen nicht wie diese Typen

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = (View) inflater.inflate(getItemViewType(position), parent, false); 
    } 
2

Ausgabe kommt aufgrund getItemViewType() zurückkehrt Wert größer als die Anzahl der Ansicht if(convertView == null)

Verwendung überprüfen. Sie können den folgenden Code verwenden, der für mich vollkommen in Ordnung ist.

@Override 
    public int getItemViewType(int position) { 

     if(position==0) { 
      return 0; 
     } 
     return 1; 
    } 

    @Override 
    public int getViewTypeCount() { 
     return 2; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     if(convertView == null) { 
      LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      int type = getItemViewType(position); 
     if(type == 0) 
      convertView = (View) inflater.inflate(R.layout.first_layout, parent, false); 
     else 
     convertView = (View) inflater.inflate(R.layout.second_layout, parent, false); 
     } 
} 

Hinweis: Wenn nur die erste Blick unterscheidet sich dann die beste Wahl ist headerView mit der Funktion listview.addHeaderView() Funktion mit diesem link