2011-08-20 9 views
34

Ho esaminato molte esercitazioni per fare in modo che ListView abbia le lettere alfabetiche sul lato (come l'elenco Contatti), ma sembrano tutte usare una classe ListActivity e/o dati da un database mentre sto usando solo un ListView (nessuna attività speciale) e un ArrayList di dati. Qualcuno sa come posso implementare quella funzione di scorrimento alfabetico nell'elenco Contatti per il mio ListView?Come mostrare le lettere alfabetiche sul lato di Android ListView

cura Anche in questo caso

ho seguito this tutorial, che ho pensato che sarebbe finalmente farlo funzionare, ma sto ancora ricevendo un forzato vicino.

class AlphabeticalAdapter extends ArrayAdapter<String> implements SectionIndexer 
{ 
    private HashMap<String, Integer> alphaIndexer; 
    private String[] sections; 

    public AlphabeticalAdapter(Context c, int resource, List<String> data) 
    { 
     super(c, resource, data); 
     for (int i = 0; i < data.size(); i++) 
     { 
      String s = data.get(i).substring(0, 1).toUpperCase(); 
      alphaIndexer.put(s, i); 
     } 

     Set<String> sectionLetters = alphaIndexer.keySet(); 
     ArrayList<String> sectionList = new ArrayList<String>(sectionLetters); 
     Collections.sort(sectionList); 
     sections = new String[sectionList.size()]; 
     sectionList.toArray(sections); 

    } 

    public int getPositionForSection(int section) 
    { 
     return alphaIndexer.get(sections[section]); 
    } 

    public int getSectionForPosition(int position) 
    { 
     return 1; 
    } 

    public Object[] getSections() 
    { 
     return sections; 
    } 
} 

Nel LogCat, dice java.lang.RuntimeException: Unable to resume activity {(package of another app I made) android.app.SuperNotCalledExcpetion. Ho pensato che fosse davvero strano perché non mi riferisco a quell'altra app in nessuno con cui lavoro. Ho provato a disinstallare quell'altra app, ho ancora ottenuto la chiusura forzata, ma ho potuto vedere cosa ha detto LogCat perché non è stato aggiornato.

Modifica finale

Ecco il codice di lavoro. Ci scusiamo per aver postato qualcosa come 9 mesi in ritardo.

class AlphabeticalAdapter extends ArrayAdapter<String> implements SectionIndexer 
{ 
    private HashMap<String, Integer> alphaIndexer; 
    private String[] sections; 

    public AlphabeticalAdapter(Context c, int resource, List<String> data) 
    { 
     super(c, resource, data); 
     alphaIndexer = new HashMap<String, Integer>(); 
     for (int i = 0; i < data.size(); i++) 
     { 
      String s = data.get(i).substring(0, 1).toUpperCase(); 
      if (!alphaIndexer.containsKey(s)) 
       alphaIndexer.put(s, i); 
     } 

     Set<String> sectionLetters = alphaIndexer.keySet(); 
     ArrayList<String> sectionList = new ArrayList<String>(sectionLetters); 
     Collections.sort(sectionList); 
     sections = new String[sectionList.size()]; 
     for (int i = 0; i < sectionList.size(); i++) 
      sections[i] = sectionList.get(i); 
    } 

    public int getPositionForSection(int section) 
    { 
     return alphaIndexer.get(sections[section]); 
    } 

    public int getSectionForPosition(int position) 
    { 
     for (int i = sections.length - 1; i >= 0; i--) { 
      if (position >= alphaIndexer.get(sections[ i ])) { 
       return i; 
      } 
     } 
     return 0; 
    } 

    public Object[] getSections() 
    { 
     return sections; 
    } 
} 

Edit: getSectionForPosition è importante se si desidera che lo scroller appaiono nel posto giusto, mentre si scorre. Restituire solo 1 (o 0) indica che stai solo scorrendo nella prima (o seconda) sezione che risulterà nella posizione sbagliata dello scroller (per lo più esce dallo schermo). Il codice aggiunto restituisce la sezione appropriata in modo che lo scroller possa sapere dove si trova effettivamente.

+0

C'è un motivo per cui non si desidera utilizzare ListActivity? Puoi collegarti ai tutorial di cui parli? –

+0

sottostringa (0, 0)? –

+0

per ottenere la prima lettera della parola –

risposta

21

Ho dimenticato di istanziare alphaIndexer. Funziona perfettamente ora.

class AlphabeticalAdapter extends ArrayAdapter<String> implements SectionIndexer 
{ 
    private HashMap<String, Integer> alphaIndexer; 
    private String[] sections; 

    public AlphabeticalAdapter(Context c, int resource, List<String> data) 
    { 
     super(c, resource, data); 
     alphaIndexer = new HashMap<String, Integer>(); 
     for (int i = 0; i < data.size(); i++) 
     { 
      String s = data.get(i).substring(0, 1).toUpperCase(); 
      if (!alphaIndexer.containsKey(s)) 
       alphaIndexer.put(s, i); 
     } 

     Set<String> sectionLetters = alphaIndexer.keySet(); 
     ArrayList<String> sectionList = new ArrayList<String>(sectionLetters); 
     Collections.sort(sectionList); 
     sections = new String[sectionList.size()]; 
     for (int i = 0; i < sectionList.size(); i++) 
      sections[i] = sectionList.get(i); 
    } 

    public int getPositionForSection(int section) 
    { 
     return alphaIndexer.get(sections[section]); 
    } 

    public int getSectionForPosition(int position) 
    { 
     return 1; 
    } 

    public Object[] getSections() 
    { 
     return sections; 
    } 
} 
+0

Puoi aggiungere il codice di lavoro finale per favore? – akd

+0

@Pat: Ciao, voglio anche la demo finale funzionante se l'hai completata. Grazie. –

+0

@akdurmus scusa per il lungo ritardo. –

3

Se ho capito bene, si desidera impostare fastScrollEnabled=true e che vi darà il piccolo scroller pollice sulla destra. Se si desidera aggiungere una lettera mobile come quella dei contatti, esiste un ottimo esempio nel progetto APIDemos in List9.java (http://www.devdaily.com/java/jwarehouse/android-examples/platforms/android-2/samples/ApiDemos/src/com/example/android/apis/view/List9.java.shtml)

+0

Penso che stiano chiedendo effettivamente di vedere A, B, C, ecc., simile all'interfaccia utente della lista dei contatti dell'iPhone. Una cosa del tipo di widget barra di scorrimento personalizzata. –

+0

C'è una sezione e una finestra di dialogo visibile durante lo scorrimento. E fastScrollEnabled è impostato su true su ListView. –

Problemi correlati