49 votes

Comment créer une barre de défilement alphabétique affichant toutes les lettres dans Android ?

Mon objectif est d'obtenir quelque chose comme ça :
http://appsreviews.com/wp-content/uploads/2010/08/Cures-A-Z-App-for-iPhone.jpg

Mais les seuls exemples que je peux trouver sont des listes comme celle-là :
Android - défilement rapide de la liste avec l'alphabet comme sur l'activité des contacts de l'iPhone

Évidemment, je ne veux pas d'une liste comme celle des contacts qui affiche les lettres lorsque l'on fait défiler le texte. Je sais comment faire.

Toute indication est la bienvenue. (J'ai essayé este mais sans succès)

Ci-dessous, la solution complète telle que suggérée par FunkTheMonk (merci beaucoup) :

Définissez le listview comme d'habitude. Définissez un RelativeLayout contenant les éléments suivants ListView et à droite, un LinearLayout avec toutes les lettres. Pour une meilleure solution, la liste des lettres pourrait être générée dynamiquement pour n'afficher que les lettres de la liste. Ensuite, dans la méthode onClick, ajoutez le comportement permettant de faire défiler la liste :

xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent">

    <ListView android:id="@android:id/list" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginRight="28dip" />

    <LinearLayout android:orientation="vertical"
        android:layout_width="28dip" android:layout_height="wrap_content"
        android:layout_alignParentRight="true" android:background="@android:color/transparent" >

        <TextView android:id="@+id/A" android:text="A" android:tag="A"
            style="@style/alphabetTextView"/>
        <TextView android:id="@+id/B" android:text="B" android:tag="B"
            style="@style/alphabetTextView" />
        <TextView android:id="@+id/C" android:text="C" android:tag="C"
            style="@style/alphabetTextView" />
        <TextView android:id="@+id/D" android:text="D" android:tag="D"
            style="@style/alphabetTextView" />
        <TextView android:id="@+id/E" android:text="E" android:tag="E"
            style="@style/alphabetTextView" />
        <TextView android:id="@+id/F" android:text="F" android:tag="F"
            style="@style/alphabetTextView" />
        <TextView android:id="@+id/G" android:text="G" android:tag="G"
            style="@style/alphabetTextView" />
        <TextView android:id="@+id/H" android:text="H" android:tag="H"
            style="@style/alphabetTextView" />
        <TextView android:id="@+id/I" android:text="I" android:tag="I"
            style="@style/alphabetTextView" />
        <TextView android:id="@+id/J" android:text="J" android:tag="J"
            style="@style/alphabetTextView" />
        <TextView android:id="@+id/K" android:text="K" android:tag="K"
            style="@style/alphabetTextView" />
        <TextView android:id="@+id/L" android:text="L" android:tag="L"
            style="@style/alphabetTextView" />
        <TextView android:id="@+id/M" android:text="M" android:tag="M"
            style="@style/alphabetTextView" />
        <TextView android:id="@+id/N" android:text="N" android:tag="N"
            style="@style/alphabetTextView" />
        <TextView android:id="@+id/O" android:text="O" android:tag="O"
            style="@style/alphabetTextView" />
        <TextView android:id="@+id/P" android:text="P" android:tag="P"
            style="@style/alphabetTextView" />
        <TextView android:id="@+id/Q" android:text="Q" android:tag="Q"
            style="@style/alphabetTextView" />
        <TextView android:id="@+id/R" android:text="R" android:tag="R"
            style="@style/alphabetTextView" />
        <TextView android:id="@+id/S" android:text="S" android:tag="S"
            style="@style/alphabetTextView" />
        <TextView android:id="@+id/T" android:text="T" android:tag="T"
            style="@style/alphabetTextView" />
        <TextView android:id="@+id/U" android:text="U" android:tag="U"
            style="@style/alphabetTextView" />
        <TextView android:id="@+id/V" android:text="V" android:tag="V"
            style="@style/alphabetTextView" />
        <TextView android:id="@+id/W" android:text="W" android:tag="W"
            style="@style/alphabetTextView" />
        <TextView android:id="@+id/X" android:text="X" android:tag="X"
            style="@style/alphabetTextView" />
        <TextView android:id="@+id/Y" android:text="Y" android:tag="Y"
            style="@style/alphabetTextView" />
        <TextView android:id="@+id/Z" android:text="Z" android:tag="Z"
            style="@style/alphabetTextView" />

    </LinearLayout>
</RelativeLayout>

Java

@Override
public void onClick(View v) {
    String firstLetter = (String) v.getTag();
    int index = 0;
    if (stringList != null) {
        for (String string : stringList) {
            if (string.startsWith(firstLetter)) {
                index = stringList.indexOf(string);
                break;
            }
        }
    }
    lv.setSelectionFromTop(index, 0);
}

0 votes

Vérifier ma réponse ici stackoverflow.com/questions/7994959/

0 votes

Bonjour, merci de votre réponse mais cela montre comment faire des en-têtes, ce qui n'est pas ce dont j'ai besoin... Regardez l'image. Ce que je veux, c'est une liste de lettres sur la droite qui, lorsque je clique sur l'une d'elles, fait défiler la liste jusqu'au premier élément commençant par cette lettre.

0 votes

@Sephy Je ne reçois pas l'événement onClick, pouvez-vous m'expliquer comment cela fonctionne ?

44voto

FunkTheMonk Points 6639

Il s'agit d'une fonctionnalité de l'iPhone, Android utilise le défilement rapide. Je vous recommande d'utiliser l'alternative de la plateforme plutôt que d'essayer d'imposer une fonctionnalité commune.

Si vous devez le faire, vous devrez le faire vous-même. Placez votre vue de liste dans un RelativeLayout et placez les TextViews de A à Z dans un LinearLayout vertical qui est configuré de la manière suivante layout_alignParentRight="true" . Réglez la balise du TextView sur A-Z de manière appropriée et réglez la balise onClick="quickScroll" sur toutes ces personnes.

Mettre en œuvre dans votre activité :

public void quickScroll(View v) {
    String alphabet = (String)v.getTag();
    //find the index of the separator row view
    list.setSelectionFromTop(index, 0);
}

Cela fera défiler les lettres sélectionnées lors du clic, mais je crois que vous pouvez faire défiler votre doigt sur l'alphabet sur l'iPhone et la liste sera mise à jour ? Pour cela, vous devrez implémenter un onTouchListener plutôt qu'un onClickListener.

2 votes

Oui, je sais que c'est une fonction de l'iPhone, mais ce n'est pas pour moi. Je fais donc ce que l'on me demande. Mais je suis d'accord avec vous, se conformer à la méthode d'Android serait mieux. Un indice sur la façon d'obtenir le séparateur ?

1 votes

Merci. Cela fonctionne bien. Ajoutez également Android:clickable="true" aux TextViews.

0 votes

Merci Explication de la situation à New York :)

25voto

Jul Points 3909

Vous pouvez essayer d'utiliser IndexScroller qui n'est visible qu'au toucher et qui est automatiquement invisible en l'absence de contact. Voici la capture d'écran

screenshot

1 votes

C'est exactement ce dont j'avais besoin ! Merci.

0 votes

@PankajNimgade : Créez une nouvelle question et expliquez ce que vous avez essayé et comment cela n'a pas fonctionné :)

0 votes

@juandg, comment avez-vous implémenté cela en code, je n'ai jamais obtenu les alphabets sur le côté droit. Merci de m'aider.

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