2010-10-26 7 views
8

Ho appena aggiunto un'intestazione al mio ListView e devo cambiare un po 'di codice perché l'intestazione diventa essenzialmente la posizione 0 (Significato Gli indici del cursore del mio CursorAdapter non si allineano con gli indici della lista. entro 1 ora). Perché? Questo mi sembra un po 'sciocco.C'è una buona ragione per una intestazione di ListView occupare una posizione?

L'unico motivo per cui posso venire è che uno sviluppatore potrebbe voler accedere all'intestazione. Belle. Fornire qualcosa come getListView(). GetHeader().

+2

Attendi fino a quando non devi inserire le intestazioni di sezione. È un incubo. – Falmarri

+0

Fintanto che ci si riferisce all'adapter associato all'elenco, non si dovrebbero avere problemi "off-one". L'aggiunta di intestazioni/piè di pagina avvolge l'adattatore e apporta queste regolazioni all'utente. –

+0

Posso inserire le intestazioni della mia sezione in modo corretto. Con un ArrayAdapter, le intestazioni di sezione sono voci di elenco effettive. Con un CursorAdapter, ogni elemento ha un'intestazione come parte della sua Vista, ma viene mostrata solo per l'elemento superiore di ogni sezione. Il problema con entrambi questi approcci è che l'intestazione scompare; così potresti finire con una lista piena di elementi e non sapere quale intestazione sono sotto perché l'intestazione è scorsa dalla parte superiore dello schermo. Stavo facendo esperimenti con le intestazioni di ListView per aggirare questo problema, ma a quanto pare scorrono anche loro. – Andrew

risposta

1

Credo che uno ListView non è altro che un elenco di elementi View. Se aggiungi un'intestazione (o un piè di pagina per quella materia, non dovrebbe fare alcuna differenza) al tuo ListView, quell'elemento non è sostanzialmente diverso da nessuno degli altri elementi che viene aggiunto automaticamente tramite lo ListAdapter. L'unica differenza minore è che l'elemento di intestazione (e il piè di pagina) verrà corretto e non sarà influenzato da ciò che lo ListAdapter fa con l'elenco, sebbene non siano altro che elementi ordinari.

21

Per qualche motivo il position (dal onItemClick) è legata con il numero di elementi nella ListView (non l'adattatore), comprese le intestazioni e piè di pagina. Quando si imposta uno OnItemClickListener, è necessario recuperare l'elemento selezionato chiamando listView.getItemAtPosition(position) anziché adapter.getItem(position).

In effetti, si dovrebbe sempre usare lo getItemAtPosition, perché in questo modo non importa se il proprio ListView ha intestazioni e piè di pagina e se si aggiungono nuove intestazioni non è necessario modificare il codice.

E se non si desidera che l'intestazione sia selezionabile, è necessario aggiungerla in questo modo: listView.addHeaderView(headerView, null, false).

+0

Bello. +1 dal mio lato. –

Problemi correlati