36 votes

Comment faire pour afficher les lettres de l'alphabet sur le côté d'Android ListView

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.

21voto

Pat Needham Points 463

J'ai oublié de les instancier alphaIndexer. Fonctionne parfaitement maintenant.

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

3voto

Sashi Points 566

Si je vous comprends bien, vous voulez mettre en fastScrollEnabled=true et qui va vous donner le petit pouce barre de défilement sur la droite. Si vous souhaitez ajouter un flottant lettre comme celle dans les contacts, il en est un excellent exemple dans le APIDemos projet List9.java (http://www.devdaily.com/java/jwarehouse/android-examples/platforms/android-2/samples/ApiDemos/src/com/example/android/apis/view/List9.java.shtml)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X