Questo è un comportamento intenzionale del FastScroller
. Quando chiami setAdapter
sul tuo ListView
, l'adattatore è avvolto in un HeaderViewListAdapter
se ci sono delle intestazioni impostate; questo è il motivo per cui è necessario chiamare addHeaderView
prima del setAdapter
. Poi, nel codice FastScroller
, vediamo:
if (adapter instanceof HeaderViewListAdapter) {
mListOffset = ((HeaderViewListAdapter)adapter).getHeadersCount();
adapter = ((HeaderViewListAdapter)adapter).getWrappedAdapter();
}
Cioè, ottenere un offset e utilizzare l'adattatore sottostante. mListOffset
viene quindi utilizzato per impostare la posizione superiore in cui scorrere con lo scroller veloce. Quindi, dove si svolge questo involucro? Fino a, come previsto, ListView.addHeaderView
, dove si vede:
if (mHeaderViewInfos.size() > 0|| mFooterViewInfos.size() > 0) {
mAdapter = new HeaderViewListAdapter(mHeaderViewInfos, mFooterViewInfos, adapter);
} else {
mAdapter = adapter;
}
Quindi stiamo sicuramente cercando intorno al posto giusto. Ora, sembra che il tuo obiettivo è NON avere il comportamento di offset per le intestazioni di lista per il tuo pollice veloce, ma altrimenti avere un elenco normale con intestazione. Per fare ciò, è sufficiente (in base a ciò che abbiamo visto del codice) avere FastScroller.mListOffset = 0
. Questo valore è impostato solo su getSectionsFromIndexer
, che è chiamato in modo incondizionato in init
e condizionatamente in diverse altre funzioni solo quando mListAdapter == null
. mListAdapter
è nullo se viene chiamato onSectionsChanged
, quindi ignoriamo il percorso per ora.
Dopo un sacco di scavo e giocando con vari ganci di riflessione, posso dire che non c'è modo di farlo che sarà anche leggermente compatibile con il futuro. Puoi usare reflection per scambiare HeaderViewListAdapter con uno che si trova sul numero di intestazioni, ecc; ma è piuttosto fragile. Allo stesso modo, è possibile creare una sottoclasse del FastScroller (pacchetto visibile) con uno con il proprio comportamento; ma lo mListOffset
viene riferito ampiamente e non attraverso un getter, quindi questo è ancora più brutto del solito. Fondamentalmente, stai andando contro il fatto che il sistema non funzioni nel modo che preferisci.
Esito a chiamare questo un errore, dal momento che è chiaro dal codice che è un comportamento deliberato. Hai considerato di rendere il primo elemento della lista solo un primo elemento speciale (possibilmente utilizzando un custommolto simile a HeaderViewListAdapter
se lo si desidera per la contabilità), piuttosto che usare il meccanismo di intestazione?
Hai mai scoperto come risolvere questo problema? – clauziere