2013-02-05 13 views
5

In android setFastScrollEnabled(true); viene utilizzato per effettuare lo scorrimento veloce ListView.Codice listview Android per abilitare Fast Scroll nel codice sorgente Android framework

Questo scorrimento veloce non funziona quando ci sono meno elementi in ListView. L'ho letto da qualche parte che lo scroll veloce in Android funziona solo quando l'altezza totale di listview è 4 volte o superiore all'altezza visibile listview. Ho passato ore a cercare di trovarlo nel codice sorgente del framework, ma non riesco a trovarlo.

Qualcuno può indicarmi di posizionare nel codice sorgente di Android framework dove questa condizione disabilita lo scorrimento veloce quando ci sono meno elementi in ListView.

risposta

8

Sì naturalmente, ecco il link:

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/1.5_r4/android/widget/FastScroller.java

Questa è una condidion tra le linee 224-227. E per impostare il numero di pagine che sarà necessario per mostrare scorrimento veloce, c'è una costante:

private static int MIN_PAGES = 4; 

e sulla disattivazione è ... E 'un campo privato quindi non c'è semplicemente il modo per farlo. Puoi provare a utilizzare i riflessi o creare FastScroller personalizzato in base all'originale. ma penso che il modo più semplice è quello di verificare come in questo condidion nel codice Android:

//pseudocode 
int numberOfPages = listView.itemsCount/listView.visibleItemsCount; 
if(numberOfPages > yourValue) 
    listView.setFastScrollEnabled(true); 
else 
    listView.setFastScrollEnabled(false); 

ma può funzionare solo se yourValue sarà superiore a 4. Se si desidera farlo per meno valori, allora avete bisogno usare la riflessione o creare una classe personalizzata.

EDIT:

Per nuova versione v'è il link: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.1.1_r1/android/widget/FastScroller.java/

e le righe sono 444-447 :)

E per riflessioni vorrei provare qualcosa di simile:

try { 
Field scrollerField = AbsListView.class.getDeclaredField("mFastScroller"); //java.lang.reflect.Field 
scrollerField.setAccessible(true); 
FastScroller instance = scrollerField.get(listViewInstance); 

Field minPagesField = instance.getClass().getDeclaredField("MIN_PAGES"); 
minPagesField.setAccessible(true); 
minPagesField.set(instance, yourValue); 
} catch (Exception e) { 
Log.d("Error", "Could not get fast scroller"); 
} 

Non è testato, quindi non so se funziona davvero.

+1

grazie per la risposta dettagliata. – anujprashar

0

si può provare a impostare l'attributo

android:fastScrollAlwaysVisible="true" 

in xml ListView

Problemi correlati