J'ai regardé beaucoup de tutoriels pour faire un ListView ont les lettres de l'alphabet sur le côté (comme la liste des Contacts), mais ils ont tous l'air à l'aide d'une ListActivity classe et/ou les données d'une base de données alors que je suis juste à l'aide d'un ListView (aucune Activité) et une liste de tableaux de données. Personne ne sait comment je peux mettre en œuvre alphabétique-fonction de défilement dans la liste des Contacts pour ma ListView?
Réédité
J'ai suivi ce tutoriel, qui je pensais allait enfin faire fonctionner, mais je suis encore en train de forcer un proche.
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;
}
}
Dans le LogCat, dit-il java.lang.RuntimeException: Unable to resume activity {(package of another app I made) android.app.SuperNotCalledExcpetion
. J'ai pensé que c'était vraiment bizarre parce que je n'ai pas de référence que l'autre app à tous dans celui que je suis en train de travailler avec. J'ai essayé de désinstaller cette application d'autres, encore forcé à fermer, mais je pouvais voir ce que le LogCat dit, car il n'a pas de mise à jour.
Montage Final
Voici le code de travail. Désolé pour l'affichage de quelque chose comme 9 mois de retard.
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 est important si vous voulez que votre barre de défilement apparaît à la bonne place, alors que vous êtes de défilement. De retour seulement 1 (ou 0) indique que vous êtes juste de défilement dans le premier (ou le deuxième) de la section qui va entraîner la molette de la mauvaise position (surtout va sortir de l'écran). Ajout d'un code renvoie à la section appropriée de sorte scroller peut savoir où il est réellement.