2012-10-19 2 views
22

Sono confuso circa la differenza tra postion e row id in ListActivity.onListItemClick().Differenza pratica tra posizione e ID riga in onListItemClick()

La documentazione ha il seguente:

position The position of the view in the list 
id  The row id of the item that was clicked 

C'è qualche differenza pratica tra i due? Presumo, dal momento che ci sono due diversi parametri, che ci sono situazioni in cui i valori sono diversi, ma sulla base della dicitura utilizzata nella documentazione, è difficile capire quale possa essere questa differenza. È che uno di loro può contenere il valore di un ID di riga del database fornito da un Cursor o qualche altra capacità speciale?

+2

Dire stesso ordine della lista. Quindi la posizione sarebbe molto diversa dall'id. La posizione è dall'alto in basso e id è un identificatore univoco. –

+0

Come viene quindi assegnato l'identificativo univoco? L'ordine degli elementi in ListView viene prima popolato, prima che venga eseguito qualsiasi operazione come l'ordinamento? –

risposta

30

posizione: La posizione della vista nell'elenco
id: L'id riga dell'elemento che è stato cliccato

Una posizione parte da 0, verso il basso della ListView, mentre per ottenere un id corretto della riga è importante che il cursore, che è stato passato all'adattatore, contenga una colonna chiamata '_id' che rappresenta l'id univoco per ogni riga nella tabella.

Se si utilizza un ArrayAdapter, position e id diventano uguali. L'id sarà il valore restituito di Adapter.getItemId(int), quindi se si utilizza un ArrayAdapter sarà uguale alla posizione - una ricerca rapida del codice sorgente ArrayAdapter mostra che sta usando la posizione di ritorno; per elaborare l'id.

+0

Se la tabella non contiene un campo '_id', allora è sicuro dire che la posizione e l'ID della riga saranno uguali? –

+4

Sembra che se si utilizza un arrayAdapter è lo stesso. L'id sarà il valore restituito di Adapter.getItemId (int), quindi se si utilizza un ArrayAdapter sarà uguale alla posizione - una ricerca rapida del codice sorgente di ArrayAdapter mostra che sta usando la posizione di ritorno; per elaborare l'id :) –

+3

Questo trascura il caso di avere un 'ListView' con una vista di intestazione. In questo caso position = id + 1. [Vedere la mia risposta] (http://stackoverflow.com/a/24531354/383414) –

24

Il answer by Lazy Ninja è per lo più corretto, tuttavia trascura il caso di utilizzare uno ArrayAdapter con una vista di intestazione aggiunta chiamando il metodo ListView.addHeaderView(View).

Se la lista ha una voce di intestazione, sarà in posizione 0.

Quindi il primo punto "reale" nella lista avrà:

  • position = 1
  • id = 0

In generale, position = id + number_of_header_views


Questo è importante rendersi conto se si decide di aggiungere una vista di testa ad una lista in codice che è già al lavoro in modo corretto.

Se si accede tuoi articoli utilizzando position, quindi il codice deve essere aggiornata secondo le seguenti linee:

  • uso position - 1 come l'indice
  • uso id come l'indice
  • uso ListView.getItemAtPosition(int) invece di Adapter.getItem(int)

Vedere anche questa domanda per la discussione correlata:

+2

La differenza postata da voi è un punto molto critico nel comprendere la listview con intestazione .. Grazie a voi lotto per la tua risposta aggiuntiva qui .. – Kushal