2011-08-20 14 views
34

He visto una gran cantidad de tutoriales para hacer que un ListView tenga las letras en orden alfabético (como la lista de contactos), pero todos parecen usar una clase ListActivity y/o datos de una base de datos mientras estoy usando un ListView (sin actividad especial) y una lista de datos Array. ¿Alguien sabe cómo puedo implementar esa función de desplazamiento alfabético en la lista de contactos para mi propio ListView?Cómo mostrar las letras alfabéticas en el lado de Android ListView

nuevamente la edición de

me siguió this tutorial, que pensé que sería finalmente hacer que funcione, pero todavía estoy consiguiendo un cierre forzado.

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; 
    } 
} 

En el LogCat, dice java.lang.RuntimeException: Unable to resume activity {(package of another app I made) android.app.SuperNotCalledExcpetion. Pensé que era realmente extraño porque no hago referencia alguna a esa otra aplicación en la que estoy trabajando. Intenté desinstalar esa otra aplicación, aún así tuve que cerrar forzadamente, pero pude ver lo que decía el LogCat porque no se actualizaba.

edición final

Aquí está el código de trabajo. Perdón por publicar algo así como 9 meses de retraso.

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; 
    } 
} 

Editar: getSectionForPosition es importante si usted quiere que su rueda de desplazamiento aparece en el lugar correcto, mientras que se está desplazando. Si regresas solo 1 (o 0), te dirá que solo estás desplazándote en la primera (o segunda) sección, lo que dará como resultado la posición incorrecta del desplazamiento (la mayoría de las veces se sale de la pantalla). El código agregado devuelve la sección adecuada para que el usuario pueda saber dónde está realmente.

+0

¿Hay algún motivo por el que no desee utilizar ListActivity? ¿Puedes vincular a los tutoriales de los que hablas? –

+0

subserie (0, 0)? –

+0

para obtener la primera letra de la palabra –

Respuesta

21

Olvidé crear una instancia de alphaIndexer. Funciona perfectamente ahora

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

¿Puede agregar el código de trabajo final por favor? – akd

+0

@Pat: Hola, también quiero la demostración final en funcionamiento si la has completado. Gracias. –

+0

@akdurmus lo siento por la larga demora. –

3

Si lo entiendo correctamente, quiere establecer fastScrollEnabled=true y eso le dará el pequeño control deslizante a la derecha. Si desea agregar una letra flotante como la de los contactos, hay un gran ejemplo en el proyecto APIDemos en 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

Creo que están pidiendo ver A, B, C, etc, similar a la interfaz de usuario de la lista de contactos del iPhone. Una cosa de widget de barra de desplazamiento personalizada. –

+0

Hay una sección y un cuadro de diálogo visible durante el desplazamiento. Y fastScrollEnabled está establecido en verdadero en ListView. –

Cuestiones relacionadas