2013-04-08 5 views
5

Esiste un modo per ottenere l'ID risorse (come R.layout.viewtoInflate) del layout da cui è stata gonfiata una visualizzazione?Ottieni l'ID risorsa da cui è stata gonfiata la visualizzazione

Sto tentando di implementare una visualizzazione elenco che utilizza 2 layout personalizzati per gli elementi dell'elenco. Il layout dell'articolo utilizzato è basato su un campo negli oggetti utilizzati per popolare la vista elenco.

Quello che mi manca nel mio adattatore personalizzato è un modo per sapere quale risorsa è stata gonfiata da "convertView" che ottengo in getView(). Se riesco a ottenere quelle informazioni posso confrontare e determinare se posso riutilizzare la visualizzazione convert come è o se devo sostituirlo con il layout appropriato per l'elemento corrente.

Quindi idealmente sarebbe qualcosa di simile:

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

    JSONObject currItem = mItems.getJSONObject(position); 

    int layoutType; 

    if (currItem.getBoolean("alternate")) 
     layoutType = R.layout.list_item_b; 
    else 
     layoutType = R.layout.list_item_a; 

    if (convertView == null || <convertView.resourceID> != layoutType) { 
     convertView = inflater.inflate(layoutType, null); 

     //Finish setting up new View and its holder 
    } 
    else { 
     //Get view holder for view reuse 
    } 

    //populate view with the required content 

    return convertView; 
} 

Nel peggiore dei casi ho potuto solo Non riutilizzare vista a tutti e basta gonfiare il layout ho bisogno ogni volta, ma sembra molto dispendioso.

risposta

5

Esiste un modo ufficiale di utilizzare più layout, semplicemente sovrascrivere getViewTypeCount() e getItemViewType(). Questi metodi informano l'Adattatore di aspettarsi layout multipli e convertView sarà sempre il layout appropriato (quindi non è necessario controllare l'ID della risorsa.) Si prega di vedere this example per alcuni codice di esempio.

Ma se si vuole scoprire quale layout è, basta controllare una caratteristica unica. Ad esempio, è possibile utilizzare findViewById() su una vista che esiste solo in un layout, quindi verificare se restituisce null oppure no.

+0

Non capisco come ho perso questa funzionalità multi-layout ma grazie. Grazie anche per il suggerimento per trovare il tipo di layout, non più necessario per ora, ma buono a sapersi comunque. Tuttavia, mi sembra strano che non ci sia un modo ufficiale per ottenere il layout di una vista gonfiata. – RobertoCuba

3

La visualizzazione elenco supporta più layout: è necessario restituire il conteggio dei layout utilizzati in getViewTypeCount() e il tipo di layout corretto per la riga in getItemViewType().

E se vuoi sapere ancora quale layout è stato gonfiato, puoi allegare qualsiasi informazione alla vista usando setTag() e recuperarla in seguito usando getTag() - può essere il tuo layoutId o qualsiasi altra cosa.

-1

Se stai chiedendo di ottenere gli id ​​degli articoli dal layout che hai gonfiato. Funziona così: -

//Suppose you have an TextView in the inflated layout of id textView1. Here you go 

convertView = inflater.inflate(layoutType, null); 
TextView tv = (TextView)convertview.findViewById(R.id.textView1); 
+0

In che modo il codice sopra riportato restituisce l'ID dell'articolo gonfiato. findviewbyid restituisce solo la vista e non l'id –

1

Quello che faccio è salvare l'ID risorsa della vista gonfiata nel titolare della vista durante la creazione della vista. Questo mi consente di ottenere l'ID della risorsa di layout quando compilo le visualizzazioni.

Spero che questo aiuti.