studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones android listview

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



manual de programacion android pdf (2)

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<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.

Final Edit

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