Autore Topic: [Facile] ListView con indice alfabetico  (Letto 2116 volte)

Offline CrotaNexus

  • Utente normale
  • ***
  • Post: 156
  • Vuolsi così colà dove si puote ciò che si vuole
  • Respect: +25
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    SimoneDev
  • Sistema operativo:
    Windows 8.1
[Facile] ListView con indice alfabetico
« il: 24 Agosto 2014, 08:04:35 CEST »
0
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

Codice (Java): [Seleziona]
public Adattatore(Context context, int resource, ArrayList<Oggetto> lista) {    
        super(context, resource, resource, lista);
        // TODO Auto-generated constructor stub.
        this.context = context;
        this.lista = lista;
       
        //Utilizzando l'HashMap si ovvia al problema di poter avere duplicati all'interno dell'array
        mappa = new LinkedHashMap<String, Integer>();
       
        for(int i=0;i<lista.size();i++) {
            //Aggiuniamo ogni elemento contenuto nell'ArrayList all'HashMap prendendo solo la prima lettera e rendendola maiuscola
            mappa.put(lista.get(i).titolo.substring(0, 1).toUpperCase(), i);
        }
                 
        arrayList = new ArrayList<String>(mappa.keySet());
       
        //Ordiniamo l'ArrayList
        Collections.sort(arrayList);
 
        //Creiamo un nuovo Array di stringhe basandoci sul numero di elementi contenuti in arrayList
        lettere = new String[arrayList.size()];
 
        arrayList.toArray(lettere);
    }

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

Codice (Java): [Seleziona]
    @Override
    public Object[] getSections() {
        // TODO Auto-generated method stub
        //Ritorniamo l'array delle iniziali delle lettere
        return lettere;
    }

    @Override
    public int getPositionForSection(int sectionIndex) {
        // TODO Auto-generated method stub
        //Prendiamo la lettera corrispondente al valore di sectionIndex
        return mappa.get(lettere[sectionIndex]);
    }

    @Override
    public int getSectionForPosition(int position) {
        // TODO Auto-generated method stub
        return 0;
    }

Ho dimenticato di dire che affinchè tutto ciò funzioni c'è bisogno del fastScroll abilitato quindi o inserite nel codice XML della ListView
Codice (XML): [Seleziona]
android:fastScrollEnabled="true"
oppure da codice Java

Codice (Java): [Seleziona]
listView.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!
SimoneDev @ Google Play Store