21

Potrebbe spiegare il metodo di un ArrayAdaptergetView().spiegazione del metodo GetView() di un ArrayAdapter

Ho letto la documentazione e ha tre parametri:

  • position: La posizione della voce all'interno dei dati della scheda di set di la voce di cui vogliamo vista.
  • convertView: la vecchia visione di riutilizzare, se possibile. Nota: è necessario verificare che questa vista sia non nulla e di un tipo appropriato prima dell'uso. Se non è possibile convertire questa vista per visualizzare i dati corretti, questo metodo può creare una nuova vista.
    liste eterogenee possono specificare il numero di tipi di vista, in modo che questa visione è sempre del tipo giusto (vedi getViewTypeCount() e getItemViewType (int)).
  • parent: Il genitore che questo punto di vista sarà eventualmente allegata al

ho capito il parametro position. Come hanno detto, implica la posizione dell'oggetto, la vista è stata richiesta.

dove viene convertView provengono da. Ho visto molti esempi in cui controllano se convertView è nullo. Se è nullo, gonfiano una nuova istanza del layout di riga, lo popolano e lo restituiscono. Credo di essermi messo alla testa anche io, ma una cosa mi sconcerta ancora. Qual è il layout che viene passato attraverso il parametro convertView. È se the resource parameter that is passed in when initialising the ArrayAdapter? È una copia cache dell'ultimo layout restituito da getView()?

E infine. Cosa fa il parametro parent. Non ho visto troppi esempi con questo. Molti di loro semplicemente riutilizzano/gonfiano un layout di riga e lo restituiscono.

(Mi sto chiedendo perché ho un'animazione on-clic nella mia ListView. In particolare this one that aims to replicate Spotify's dropdown quick action menu. La mia animazione è stata un po 'lenta. Dopo la diagnosi di questo problema per un po', mi sono reso conto che questo è stato a causa di il fatto che il mio metodo getView() prende un po 'di tempo per completare come sto gonfiando un layout fila fresco in ogni iterazione. qualcuno ha suggerito la memorizzazione nella cache del layout riga in un ViewHolder mentre altri esempi indicano riutilizzare il parametro convertView cioè solo gonfiare un layout di fila se convertView è nullo.)

risposta

44

È una copia memorizzata nella cache dell'ultimo layout restituito da getView()?

Il convertView è la vista di una riga che ha lasciato lo schermo (quindi non è l'ultima vista restituito dal metodo getView). Ad esempio, l'elenco viene visualizzato per la prima volta, in questo caso convertView è null, nessuna vista di riga è stata creata in precedenza e ha lasciato lo schermo. Se si scorre verso il basso, riga 0 lascerà la schermata (non sarà più visibile), quando ciò accade il ListView può scegliere di mantenere questo punto di vista in una cache utilizzare in seguito ad esso (questo ha un senso, come le righe di una ListView hanno generalmente lo stesso layout con solo i dati differenti). Il motivo per mantenere alcune viste in una cache e utilizzarle successivamente è perché il metodo getView può essere chiamato un sacco di volte (ogni volta che l'utente scorre su/giù e nuove righe vengono visualizzate sullo schermo). Se ogni volta la vista della riga dovesse essere ricreata, ciò avrebbe comportato la creazione di molti oggetti che è qualcosa da evitare.Nel tuo metodo getView dovresti controllare convertView per vedere se è null. Se è null, allora deve creare una nuova vista di riga e popolare con i dati, se non è null, il ListView ti ha offerto una vista precedente. Avere questa vista precedente significa che non hai bisogno di costruire un nuovo layout di riga, invece tu devi popolarlo con i dati corretti, dato che quella cache ha i vecchi dati ancora attaccati ad essa (vedresti molte domande su stackoverflow in cui gli utenti chiedono perché le righe del loro ListView stanno duplicando quando scorrono verso il basso).

Cosa fa il parametro padre. Non ho visto troppi esempi utilizzando questo. Molti di loro semplicemente riutilizzano/gonfiano un layout di riga e lo restituiscono .

Deve essere utilizzato per ottenere il LayoutParams corretto per la riga appena gonfiata/costruita. Ad esempio, se si gonfia un layout che ha un RelativeLayout come root e non si utilizza lo parent per ottenere lo LayoutParams si potrebbero avere alcuni problemi con il layout di riga. Per prendere il genitore in considerazione si usa:

convertView = getLayoutInflater().inflate(R.layout.row_layout, parent, false); 
+3

Questa è davvero una bella risposta! – Tarik

+0

la migliore risposta tnx –

2

mia comprensione di convertView è che è essenzialmente una vista che sono stati riciclati perché non sono in uso al momento - per esempio, si scorre l'elenco, quelli in alto non sono sullo schermo, quindi vengono passati in questo parametro per l'uso quando hai bisogno di una nuova vista (quindi non devi crearne uno completamente nuovo mentre quelli inutilizzati sono in giro inutilizzati). iOS ha un metodo simile chiamato dequeueReusableCellWithIdentifier. Se ogni riga del listview ha la stessa struttura, è sicuro lanciare questo nel tipo appropriato e aggiornare semplicemente le informazioni in esso contenute: testo, immagini, ecc. Sarà una vista che è stata precedentemente restituita da una chiamata getView() per lo stesso elenco.

La mia ipotesi migliore (ed è certamente un'ipotesi) con parent è che è la vista che l'elenco di questo adattatore è figlio di. Ti dà una via per tornare al sistema di rendering se hai bisogno di un contesto, accesso al sistema di risorse, per passare informazioni o ricevere informazioni dalla vista principale della lista.

Problemi correlati