Livello di difficoltà: facile
Versione SDK utilizzata: 8
Vedendo l'applicazione Persone di Google ho voluto provare ad implementare l'indice alfabetico che si trova sulla sinistra quando viene scrollata rapidamente la ListView e sono rimasto sbalordito dall'incredibile semplicità con la quale si realizza questo meccanismo.
Una volta popolata la ListView ci basterà costruire il nostro custom adapter ed implementare l'interfaccia SectionIndexer e facendo l'Override dei suoi metodi (getSections, getPositionForSection e getSectionForPosition). Quindi inserire nel costruttore dell'adapter quanto segue
1public Adattatore(Context context, int resource, ArrayList<Oggetto> lista) {
2super(context, resource, resource, lista);
3// TODO Auto-generated constructor stub.
4this.context = context;
5this.lista = lista;
6
7//Utilizzando l'HashMap si ovvia al problema di poter avere duplicati all'interno dell'array
8mappa = new LinkedHashMap<String, Integer>();
9
10for(int i=0;i<lista.size();i++) {
11//Aggiuniamo ogni elemento contenuto nell'ArrayList all'HashMap prendendo solo la prima lettera e rendendola maiuscola
12mappa.put(lista.get(i).titolo.substring(0, 1).toUpperCase(), i);
13}
14
15arrayList = new ArrayList<String>(mappa.keySet());
16
17//Ordiniamo l'ArrayList
18Collections.sort(arrayList);
19
20//Creiamo un nuovo Array di stringhe basandoci sul numero di elementi contenuti in arrayList
21lettere = new String[arrayList.size()];
22
23arrayList.toArray(lettere);
24}
Vediamo ora come funzionano i metodi dell'interfaccia SectionIndexer.
Il metodo getPositionForSection(int section) ritorna la prima posizione della sezione.
Il metodo getSectionForPosition(int position) ritorna l'indice della corrispettiva sezione all'interno dell'array in quella specifica posizione.
Il metodo getSections() ritorna un'array di oggetti che rappresentano le sezioni della lista.
"Configuriamo" i metodi sopra esposti come segue
x12public Object[] getSections() {
3// TODO Auto-generated method stub
4//Ritorniamo l'array delle iniziali delle lettere
5return lettere;
6}
7
8
9public int getPositionForSection(int sectionIndex) {
10// TODO Auto-generated method stub
11//Prendiamo la lettera corrispondente al valore di sectionIndex
12return mappa.get(lettere[sectionIndex]);
13}
14
15
16public int getSectionForPosition(int position) {
17// TODO Auto-generated method stub
18return 0;
19}
Ho dimenticato di dire che affinchè tutto ciò funzioni c'è bisogno del fastScroll abilitato quindi o inserite nel codice XML della ListView
11android:fastScrollEnabled="true"
oppure da codice Java
11listView.setFastScrollEnabled(true);
Se avete seguito tutti i passaggi correttamente runnando l'applicazione e facendo un fast scroll dovreste avere qualcosa come questo
Il codice è stato testato da me personalmente su KitKat e Gingerbread ed il tutto funziona senza alcun tipo di problema.
Spero che questo tutorial sia stato d'aiuto a qualcuno. Ciao!