IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants graphiques Android Discussion :

Mettre en place des sections dans une ListView


Sujet :

Composants graphiques Android

  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 281
    Par défaut Mettre en place des sections dans une ListView
    Bonjour,

    Tout est dans le titre.

    Je récupère des données grâce à Json. Sur chaque entrée se trouve un nom de ville et un titre. Exemple :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    {"entry":[
     
                   {"titre" : "Mon titre1" , "ville" : "Ville1"},
                   {"titre" : "Mon titre2" , "ville" : "Ville3"},
                   {"titre" : "Mon titre3" , "ville" : "Ville2"},
                   {"titre" : "Mon titre4" , "ville" : "Ville1"},
                   {"titre" : "Mon titre5" , "ville" : "Ville2"},
                   {"titre" : "Mon titre6" , "ville" : "Ville1"}
     
    ]}
    J'aimerais mettre en places des sections (Ville 1, ville 2 , ville 3) dans un ListView avec les titres correspondant pour chaque sections.

    Comment faire ?
    Merci.

  2. #2
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Exemple d'implémentation:

    D'abord coté "POJO":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class VilleData {
        ....
     
        public static VilleData  fromJSON(JSONObject obj) throws JSONException {
           VilleData ret = new VilleData ();
           ret.setTitle(obj.getString("titre"));
           ret.setVille(obj.getString("ville"));
           return ret;
        }
    }
    Ensuite coté application:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    class Activity ...
    {
     
     
        public void onJSONResult(JSONObject response)
        {
            ArrayList<VilleData> datalist = new Arraylist<VilleData>();
            try {
               JSONArray entries = response.getJSONArray("entry");
               for (int i = 0; (i < entries.length()); ++i) {
                   JSONObject entry = entries.getJSONObject(i);
                   VilleData data = VilleData.fromJSON(entry);
                   datalist.add(data);
               }
               ArrayAdapter<VilleData> adapter = new ArrayAdapter<VilleData>(..,datalist);
               ListView lv = ...;
               lv.setAdapter(adapter);
            } catch (Exception ex) {
               Toast......
            }
        }
    }
    Restera là tâche de récupération du JSON qui à la fin appelera onJSONResult()
    (dans le thread UI)

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 281
    Par défaut
    Merci de votre réponse mais je ne vois pas à quel moment il ya la gestion des "sections". Du genre :


  4. #4
    Membre Expert
    Avatar de Hephaistos007
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2004
    Messages
    2 493
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 493
    Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes --- devise SHADOKS

    Kit de survie Android : mon guide pour apprendre à programmer sur Android, mon tutoriel sur les web services et enfin l'outil en ligne pour vous faire gagner du temps - N'oubliez pas de consulter la FAQ Android

  5. #5
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 281
    Par défaut
    http://code.google.com/p/android-sec...tActivity.java

    J'ai testé votre exemple , celà marche avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    SectionListItem[] exampleArray = { 
        new SectionListItem("Titre1", "VilleA"), //
        new SectionListItem("Titre2", "VilleA"), //
        new SectionListItem("Titre3", "VilleB"), //
         new SectionListItem("Titre4", "VilleB"), //
        };
    Mais lorsque je fais ceci, pour tester, J'ai un NullPointerException sur mon exampleArray[i] :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    for (int i = 0; i < earthquakes.length(); i++) {
     
    JSONObject e = earthquakes.getJSONObject(i);					
    exampleArray[i] =   new SectionListItem(e.getString(KEY_TITRE),e.getString(KEY_VILLE));
    					}
    Ma class ListItem

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    /**
     * Item definition including the section.
     */
    public class SectionListItem {
        public Object item;
        public String section;
     
        public SectionListItem(final Object item, final String section) {
            super();
            this.item = item;
            this.section = section;
        }
     
        @Override
        public String toString() {
            return item.toString();
        }
     
    }

  6. #6
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    exampleArray n'a donc pas été initialisé à une array....

  7. #7
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 281
    Par défaut
    Citation Envoyé par nicroman Voir le message
    exampleArray n'a donc pas été initialisé à une array....
    Pourtant j'ai bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private SectionListItem[] exampleArray;
    Ma class SectionListItem

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    /**
     * Item definition including the section.
     */
    public class SectionListItem {
        public Object item;
        public String section;
     
        public SectionListItem(final Object item, final String section) {
            super();
            this.item = item;
            this.section = section;
        }
     
        @Override
        public String toString() {
            return item.toString();
        }
     
    }

  8. #8
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    private SectionListItem[] exampleArray;
    Ca c'est une déclaration (exampleArray référence un tableau de références vers SectionListItem)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    exampleArray = new SectionListItem[2183];
    Ca c'est une initialisation (exampleArray référence ce nouveau tableau de 2183 références vers SectionListItems)


    Tant que la variable n'est pas initialisée, elle est "nulle" par défaut, donc y accéder => NPE.

    Là... ou bien on passe par une collection (ArrayList par exemple), ou bien on initialise à la taille voulue avant (encore faut-il connaitre la taille).

  9. #9
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 281
    Par défaut
    Alors comment je peut remplir mon exampleArray (Type SectionListItem[] ) sans que je connaisse sa taille dans ma boucle ci-dessous ? Un exemple ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for (int i = 0; i < earthquakes.length(); i++) {
     
    JSONObject e = earthquakes.getJSONObject(i);					
     
    //...... Que dois-je mettre ?
    					}

  10. #10
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Là on connait la taille... c'est earthquakes.length()

  11. #11
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 281
    Par défaut
    Merci celà marche, maintenant j'ai un problème sur ma SectionListView extends ListView (voir code ci-dessous). Lorsque je veut mettre un Listenener , je n'ai rien à l'affichage. Voici mon code teste :



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    listView = (SectionListView) findViewById(getResources().getIdentifier( "section_list_view", "id",this.getClass().getPackage().getName()));
     
    listView.setOnItemClickListener(new OnItemClickListener() {
    					public void onItemClick(AdapterView<?> parent, View view,int position, long id) {
     
    Toast.makeText(getApplicationContext(),""+position,Toast.LENGHT_SHORT).show();
     
    					}
    				});

    Ma SectionListView

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
     
     
    package com.customlist;
     
    import android.content.Context;
    import android.util.AttributeSet;
    import android.view.View;
    import android.view.ViewParent;
    import android.widget.AbsListView;
    import android.widget.AbsListView.OnScrollListener;
    import android.widget.FrameLayout;
    import android.widget.ListAdapter;
    import android.widget.ListView;
     
    /**
     * View displaying the list with sectioned header.
     */
    public class SectionListView extends ListView implements OnScrollListener {
     
        private View transparentView;
     
        public SectionListView(final Context context, final AttributeSet attrs,
                final int defStyle) {
            super(context, attrs, defStyle);
            commonInitialisation();
        }
     
        public SectionListView(final Context context, final AttributeSet attrs) {
            super(context, attrs);
            commonInitialisation();
        }
     
        public SectionListView(final Context context) {
            super(context);
            commonInitialisation();
        }
     
        protected final void commonInitialisation() {
            setOnScrollListener(this);
            setVerticalFadingEdgeEnabled(false);
            setFadingEdgeLength(0);
        }
     
        @Override
        public void setAdapter(final ListAdapter adapter) {
            if (!(adapter instanceof SectionListAdapter)) {
                throw new IllegalArgumentException(
                        "The adapter needds to be of type "
                                + SectionListAdapter.class + " and is "
                                + adapter.getClass());
            }
            super.setAdapter(adapter);
            final ViewParent parent = getParent();
            if (!(parent instanceof FrameLayout)) {
                throw new IllegalStateException(
                        "Section List should have FrameLayout as parent!");
            }
            if (transparentView != null) {
                ((FrameLayout) parent).removeView(transparentView);
            }
            transparentView = ((SectionListAdapter) adapter)
                    .getTransparentSectionView();
            final FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(
                    LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
            ((FrameLayout) parent).addView(transparentView, lp);
            if (adapter.isEmpty()) {
                transparentView.setVisibility(View.INVISIBLE);
            }
        }
     
        @Override
        public void onScroll(final AbsListView view, final int firstVisibleItem,
                final int visibleItemCount, final int totalItemCount) {
            final SectionListAdapter adapter = (SectionListAdapter) getAdapter();
            if (adapter != null) {
                adapter.makeSectionInvisibleIfFirstInList(firstVisibleItem);
            }
        }
     
        @Override
        public void onScrollStateChanged(final AbsListView view,
                final int scrollState) {
            // do nothing
        }
     
    }

Discussions similaires

  1. Insérer des données dans une ListView
    Par Vincinho dans le forum VB.NET
    Réponses: 3
    Dernier message: 18/05/2010, 17h08
  2. Chargement des images dans une ListView
    Par loudo dans le forum Composants graphiques
    Réponses: 0
    Dernier message: 09/05/2010, 22h03
  3. Afficher des images dans une listView de manière asynchrone
    Par badaboo dans le forum Composants graphiques
    Réponses: 0
    Dernier message: 23/02/2010, 09h47
  4. Mettre en place des droits sur une vue différents de ceux de la table-source ?
    Par Antoun dans le forum Administration et Installation
    Réponses: 14
    Dernier message: 15/02/2010, 14h13
  5. Afficher des informations dans une ListView
    Par revero275 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 03/04/2007, 21h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo