CERCA
PER MODELLO
FullScreen Chatbox! :)

Utente del giorno: ryouza con ben 1 Thanks ricevuti nelle ultime 24 ore
Utente della settimana: carotix con ben 11 Thanks ricevuti negli ultimi sette giorni
Utente del mese: megthebest con ben 26 Thanks ricevuti nell'ultimo mese

Visualizzazione dei risultati da 1 a 3 su 3
Discussione:

[Facile] ListView con indice alfabetico

Se questa discussione ti è stata utile, ti preghiamo di lasciare un messaggio di feedback in modo che possa essere preziosa in futuro anche per altri utenti come te!
  1. #1
    Androidiani Power User L'avatar di Crotan


    Registrato dal
    Jul 2013
    Località
    Roma
    Messaggi
    1,265
    Smartphone
    Redmi Note 9 Pro

    Ringraziamenti
    401
    Ringraziato 1,445 volte in 626 Posts
    Predefinito

    [Facile] ListView con indice alfabetico

    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

     
    1
    public Adattatore(Context context, int resource, ArrayList<Oggetto> lista) {    
    2
            super(context, resource, resource, lista);
    3
            // TODO Auto-generated constructor stub.
    4
            this.context = context;
    5
            this.lista = lista;
    6
            
    7
            //Utilizzando l'HashMap si ovvia al problema di poter avere duplicati all'interno dell'array
    8
            mappa = new LinkedHashMap<String, Integer>();
    9
            
    10
            for(int i=0;i<lista.size();i++) {
    11
                 //Aggiuniamo ogni elemento contenuto nell'ArrayList  all'HashMap prendendo solo la prima lettera e rendendola maiuscola
    12
                mappa.put(lista.get(i).titolo.substring(0, 1).toUpperCase(), i);
    13
            }
    14
                      
    15
            arrayList = new ArrayList<String>(mappa.keySet());
    16
            
    17
            //Ordiniamo l'ArrayList
    18
            Collections.sort(arrayList);
    19
     
    20
            //Creiamo un nuovo Array di stringhe basandoci sul numero di elementi contenuti in arrayList
    21
            lettere = new String[arrayList.size()];
    22
     
    23
            arrayList.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

    x
     
    1
    @Override
    2
        public Object[] getSections() {
    3
            // TODO Auto-generated method stub
    4
            //Ritorniamo l'array delle iniziali delle lettere
    5
            return lettere;
    6
        }
    7
    8
        @Override
    9
        public int getPositionForSection(int sectionIndex) {
    10
            // TODO Auto-generated method stub
    11
            //Prendiamo la lettera corrispondente al valore di sectionIndex
    12
            return mappa.get(lettere[sectionIndex]);
    13
        }
    14
    15
        @Override
    16
        public int getSectionForPosition(int position) {
    17
            // TODO Auto-generated method stub
    18
            return 0;
    19
        }


    Ho dimenticato di dire che affinchè tutto ciò funzioni c'è bisogno del fastScroll abilitato quindi o inserite nel codice XML della ListView
    1
     
    1
    android:fastScrollEnabled="true"


    oppure da codice Java

    1
     
    1
    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!

  2.  
  3. #2
    Androidiani Power User L'avatar di Crotan


    Registrato dal
    Jul 2013
    Località
    Roma
    Messaggi
    1,265
    Smartphone
    Redmi Note 9 Pro

    Ringraziamenti
    401
    Ringraziato 1,445 volte in 626 Posts
    Predefinito

    Riservato per future evenienze.

  4. Il seguente Utente ha ringraziato Crotan per il post:

    Fabriziocolazzo (27-09-15)

  5. #3
    Baby Droid


    Registrato dal
    Jul 2015
    Messaggi
    49

    Ringraziamenti
    4
    Ringraziato 2 volte in 2 Posts
    Predefinito

    scusami, nel mio caso come dovrei fare?
    codice:
    class Ingredienti {
        private String text1;
    
        public String getText1(){
            return this.text1;
        }
        public void setText1(String text1){
    
            this.text1= text1;
        }
    
    
        public Ingredienti(String text1) {
            this.text1 = text1;
        }
    
    }
    
    
    public class Adapter_lista_nuovo_ingrediente extends BaseAdapter {
        private ArrayList mapData;
        Context context;
        int layoutResourceId;
    
        Holder2 holder2;
    
        public Adapter_lista_nuovo_ingrediente(Context context, int layoutResourceId, Map<Integer, Ingredienti> arList) {
    
            this.layoutResourceId = layoutResourceId;
            this.context = context;
    
            mapData = new ArrayList();
            mapData.addAll(arList.entrySet());
            
        }
    
        @Override
        public int getCount() {
            return mapData.size();
        }
    
    
        @Override
        public Map.Entry<Integer, Ingredienti> getItem(int position) {
            return (Map.Entry) mapData.get(position);
        }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire risposte
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Torna su
Privacy Policy