Android FastScroll copre solo una parte della lista

Ho una class che implementa l’ expandable list activity .
Nel codice XML (o posso farlo in java), ho impostato fastScrollEnabled su true . Questo in atto abilita lo scroll veloce. MA lo scorrimento veloce funziona solo nella parte superiore dell’elenco. Come posso usare la barra di scorrimento di fastscroll per scorrere l’intera lista ma funziona solo nella parte superiore della barra di scorrimento. Non è proporzionato all’intera lista. Posso trascinare la barra del pollice in fondo alla lista, ma non scorre, dal momento che la listview è già scorsa verso il basso a causa del comportamento strano di esso solo lavorando nella parte superiore della lista.
Confondendo lo so, posso provare a chiarire di più se necessario ….

BaseExpandableListAdapter. un BaseExpandableListAdapter. personalizzato BaseExpandableListAdapter.

    Ho appena trovato una soluzione alternativa per impedire al sistema di visualizzare questo comportamento errato.

    Esistono due scenari che utilizzano un codice diverso affinché SectionIndexer funzioni.

    Il primo scenario è il caso in cui si utilizza FastScrollbar-Thumb per navigare nella sezione successiva. Supponendo che i gruppi siano le tue sezioni, i metodi sovrascritti per l’implementazione di SectionIndexer dovrebbero essere:

     @Override public int getPositionForSection(int section) { return section; } // Gets called when scrolling the list manually @Override public int getSectionForPosition(int position) { return ExpandableListView.getPackedPositionGroup( expandableListView .getExpandableListPosition(position)); } 

    Il secondo scenario è il caso in cui si scorre l’elenco manualmente e le barre di scorrimento veloci si spostano in base alle sezioni, non a tutti gli elementi. Il codice quindi sembra che:

     @Override public int getPositionForSection(int section) { return expandableListView.getFlatListPosition( ExpandableListView.getPackedPositionForGroup(section)); } // Gets called when scrolling the list manually @Override public int getSectionForPosition(int position) { return ExpandableListView.getPackedPositionGroup( expandableListView .getExpandableListPosition(position)); } 

    Come si può vedere questi due comportamenti non possono giocare insieme senza un’ulteriore adozione.

    La soluzione alternativa per far funzionare entrambe le cose è catturare il caso quando qualcuno sta scorrendo per mano (cioè scorrendo via touch). Questo può essere fatto implementando l’interfaccia OnScrollListener con la class dell’adattatore e impostandola su ExpandableListView :

     public class MyExpandableListAdapter extends BaseExpandableListAdapter implements SectionIndexer, AbsListView.OnScrollListener { // Your fields here // ... private final ExpandableListView expandableListView; private boolean manualScroll; public MyExpandableListAdapter(ExpandableListView expandableListView /* Your other arguments */) { this.expandableListView = expandableListView; this.expandableListView.setOnScrollListener(this); // Other initializations } @Override public void onScrollStateChanged(AbsListView view, int scrollState) { this.manualScroll = scrollState == SCROLL_STATE_TOUCH_SCROLL; } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {} @Override public int getPositionForSection(int section) { if (manualScroll) { return section; } else { return expandableListView.getFlatListPosition( ExpandableListView.getPackedPositionForGroup(section)); } } // Gets called when scrolling the list manually @Override public int getSectionForPosition(int position) { return ExpandableListView.getPackedPositionGroup( expandableListView .getExpandableListPosition(position)); } // Your other methods // ... } 

    Questo ha risolto il bug per me.

    Questo è un bug nello scroller veloce. Non funziona bene con ExpandableListView .

    Vedi il mio codice .

    (include anche un work-around per alcuni casi)