Cómo mostrar letras alfabéticas en el lado de Android ListView

He visto muchos 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 ArrayList de datos. ¿Alguien sabe cómo puedo implementar esa función de desplazamiento alfabético en la lista de contactos para mi propio ListView?

Editado de nuevo

Seguí este tutorial , que pensé que finalmente lo haría funcionar, pero todavía estoy recibiendo un cierre forzado.

class AlphabeticalAdapter extends ArrayAdapter implements SectionIndexer { private HashMap alphaIndexer; private String[] sections; public AlphabeticalAdapter(Context c, int resource, List 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 sectionLetters = alphaIndexer.keySet(); ArrayList sectionList = new ArrayList(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.

Final Edit

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

 class AlphabeticalAdapter extends ArrayAdapter implements SectionIndexer { private HashMap alphaIndexer; private String[] sections; public AlphabeticalAdapter(Context c, int resource, List data) { super(c, resource, data); alphaIndexer = new HashMap(); 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 sectionLetters = alphaIndexer.keySet(); ArrayList sectionList = new ArrayList(sectionLetters); Collections.sort(sectionList); sections = new String[sectionList.size()]; for (int i = 0; i = 0; i-- ) { if ( position >= alphaIndexer.get( sections[ i ] ) ) { return i; } } return 0; } public Object[] getSections() { return sections; } } 

Editar: getSectionForPosition es importante si quieres que tu desplazamiento aparezca en el lugar correcto mientras estás desplazándote. 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.

Olvidé crear alphaIndexer instancia de alphaIndexer . Funciona perfectamente ahora

 class AlphabeticalAdapter extends ArrayAdapter implements SectionIndexer { private HashMap alphaIndexer; private String[] sections; public AlphabeticalAdapter(Context c, int resource, List data) { super(c, resource, data); alphaIndexer = new HashMap(); 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 sectionLetters = alphaIndexer.keySet(); ArrayList sectionList = new ArrayList(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; } } 

Si te entiendo correctamente, quieres establecer fastScrollEnabled=true y eso te dará el pequeño fastScrollEnabled=true 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 )