2010-08-05 17 views
13

Ho un ListView sul mio ListActivity e mi piacerebbe che le righe dello ListView fossero 1 di 3 layout diversi. Il primo elemento del mio elenco utilizzerà sempre il layout A, il secondo elemento del mio elenco utilizzerà sempre il layout B e tutti gli elementi successivi utilizzeranno il layout C.Elenco visualizzazioni con layout di più articoli

Ecco la mia funzione getView:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    // get the View for this list item 
    View v = convertView; 
    if (v == null) { 
     LayoutInflater vi = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     switch (position) { 
      case 0: 
       v = vi.inflate(R.layout.layout_A, parent, false); 
       break; 
      case 1: 
       v = vi.inflate(R.layout.layout_B, parent, false); 
       break; 
      default: 
       v = vi.inflate(R.layout.layout_C, parent, false); 
       break; 
     } 
    } 
    switch (position) { 
     case 0: 
      TextView txtLabel1 = (TextView)findViewById(R.id.label1); 
      TextView txtLabel2 = (TextView)findViewById(R.id.label2); 
      if (txtLabel1 != null) { 
       txtLabel1.setText("sdfasd"); 
      } 
      if (txtLabel2 != null) { 
       txtLabel2.setText("dasgfadsasd"); 
      } 
      break; 
     default: 
      break; 
    } 
    // return the created view 
    return v; 
} 

R.id.label1 e R.id.label2 sono TextViews su R.layout.layout_A. Tuttavia, txtLabel1 e txtLabel2 sono nulli dopo aver provato a impostarli. Perché?

Ho passato questo codice nel debugger e ha gonfiato il layout corretto (R.layout.layout_A) e sono caduto nel caso corretto di seguito per impostare il testo R.id.label1 e R.id.label2.

Inoltre, se c'è un modo migliore per farlo, per favore fatemelo sapere.

+0

Controllare [questo tutorial] (http://android.amberfog.com/?p=296). Spiegano qualcosa di simile a ciò che stai cercando di ottenere. – Macarse

risposta

4

Sembra "Visualizza v = convertView; if (v == null) {..." è un problema. Dovresti ricreare ogni volta la visualizzazione perché non conosci il tipo di vista data. Inoltre, è possibile utilizzare l'approccio viewholder per un'implementazione più efficiente. Puoi trovare alcune idee in questo blog: http://codinglines.frankiv.me/post/18486197303/android-multiple-layouts-in-dynamically-loading

+0

Questa è una pessima idea e rallenterà in modo significativo le prestazioni. Macarse postet è un bell'esempio che proverà comunque a riutilizzare le visualizzazioni. – Chris

Problemi correlati