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.
¿Hay algún motivo por el que no desee utilizar ListActivity? ¿Puedes vincular a los tutoriales de los que hablas? –
subserie (0, 0)? –
para obtener la primera letra de la palabra –