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 :

ListView dans une ExpandableListView


Sujet :

Composants graphiques Android

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2011
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2011
    Messages : 67
    Points : 87
    Points
    87
    Par défaut ListView dans une ExpandableListView
    Bonjour,

    Je suis face à un bug (?) et je me demande si certains d'entre vous l'ont déjà rencontré.

    Je construit une ExpandableListView (ELV) et chaque élément Child de cet ELV est en fait une ListView (LV).

    Malheureusement dans ma LV, seul 1 élément s'affiche et les autres sont "perdus". Pourtant au débogage je remarque que mon adapter contient la bonne LV avec les bons éléments mais c'est à l'affichage que cela pose problème.

    J'ai beau retourner le problème dans tous les sens et je ne trouve pas l'origine de ce soucis. Serait-ce un bug "connu" ?

    Bien à vous.

    Lionel


    Voici le code de mon élément Child qui contient la LV :

    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
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        >
     
        <RelativeLayout 
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:background="@color/light_blue" >
     
            <TextView
                android:id="@+id/tvRowASC_name"
                android:layout_width="@dimen/colWidth_medium"
                android:layout_height="wrap_content"
                android:layout_gravity="left"
                android:drawableLeft="@drawable/arrow_down"
                android:text="@string/col_asc_name"
                android:textAppearance="@style/AssetSubCatCell" />
     
            <TextView
                android:id="@+id/tvRowASC_valuation"
                android:layout_width="@dimen/colWidth_medium"
                android:layout_height="wrap_content"
                android:layout_toLeftOf="@+id/tvRowASC_pc_port"
                android:drawableLeft="@drawable/dollar"
                android:text="@string/col_asc_valuation"
                android:textAppearance="@style/AssetSubCatCell" />
     
            <TextView
                android:id="@+id/tvRowASC_pc_port"
                android:layout_width="@dimen/colWidth_medium"
                android:layout_height="wrap_content"
                android:layout_toLeftOf="@+id/tvRowASC_pc_sect"
                android:drawableLeft="@drawable/pie_chart"
                android:text="@string/col_asc_pc_port"
                android:textAppearance="@style/AssetSubCatCell" />
     
            <TextView
                android:id="@+id/tvRowASC_pc_sect"
                android:layout_width="@dimen/colWidth_medium"
                android:layout_height="wrap_content"
                android:layout_alignParentRight="true"
                android:drawableLeft="@drawable/pie_chart"
                android:text="@string/col_asc_pc_sect"
                android:textAppearance="@style/AssetSubCatCell" />
        </RelativeLayout>
     
        <ListView
            android:id="@+id/listViewPosition" 
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"/>
     
    </LinearLayout>
    Et le code XML d'une ligne de ma LV

    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
    <?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"
        android:orientation="horizontal"
        android:background="@color/white"
        android:padding="@dimen/padding_medium"
        >
     
        <TextView
            android:id="@+id/tvRowPos_name"
            android:layout_width="@dimen/colWidth_medium"
            android:layout_height="wrap_content"
            android:textAppearance="@style/PositionCell"
            android:text="@string/col_pos_name"
            />
     
        <TextView
            android:id="@+id/tvRowPos_valuation"
            android:layout_width="@dimen/colWidth_medium"
            android:layout_height="wrap_content"
            android:textAppearance="@style/PositionCell"
            android:layout_toLeftOf="@+id/tvRowPos_pc_port"
            android:text="@string/col_pos_valuation"
            />
     
        <TextView
            android:id="@+id/tvRowPos_pc_port"
            android:layout_width="@dimen/colWidth_medium"
            android:layout_height="wrap_content"
            android:textAppearance="@style/PositionCell"
            android:layout_toLeftOf="@+id/tvRowPos_pc_sect"
            android:text="@string/col_pos_pc_port"
            />
     
        <TextView
            android:id="@+id/tvRowPos_pc_sect"
            android:layout_width="@dimen/colWidth_medium"
            android:layout_height="wrap_content"
            android:textAppearance="@style/PositionCell"
            android:layout_alignParentRight="true"
            android:text="@string/col_pos_pc_sect"
            />
    </RelativeLayout>
    Et la façon dont je crée ma LV (au sein de l'Adapter pour mon ELV)

    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
    	@Override
    	public View getChildView(int groupPosition, int childPosition,
    			boolean isLastChild, View convertView, ViewGroup parent) {
    		if (convertView == null) {
    			LayoutInflater infalInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    			convertView = infalInflater.inflate(R.layout.row_asset_sub_cat, null);
    		}
    		AssetSubCat asc = (AssetSubCat) getChild(groupPosition, childPosition);
     
    		//Affichage de la SubCat
    		TextView tvAscName = (TextView) convertView.findViewById(R.id.tvRowASC_name);
    		tvAscName.setText(asc.getName());
    		TextView tvAscValuation = (TextView) convertView.findViewById(R.id.tvRowASC_valuation);
    		tvAscValuation.setText(String.valueOf(asc.getValuation()));
    		TextView tvAscPcPort = (TextView) convertView.findViewById(R.id.tvRowASC_pc_port);
    		tvAscPcPort.setText(String.valueOf(asc.getPc_port()) + "%");
    		TextView tvAscPcSect = (TextView) convertView.findViewById(R.id.tvRowASC_pc_sect);
    		tvAscPcSect.setText(String.valueOf(asc.getPc_sect()) + "%");
     
     
    		//Création de la liste des positions
    		listViewPositions = (ListView) convertView.findViewById(R.id.listViewPosition);
    		ArrayList<HashMap<String, String>> listItem = new ArrayList<HashMap<String, String>>();
    		List<Position> positions =  asc.getPosition();
            for(Position pos : positions){
                //On déclare la HashMap qui contiendra les informations pour un item
    			HashMap<String, String> map = new HashMap<String, String>();
    			map.put("id",String.valueOf(pos.getId()));
    			map.put("name", pos.getName());
    			map.put("valuation", pos.getValuation());
    			map.put("pc_port", pos.getPc_port());
    			map.put("pc_sect", pos.getPc_sect());
            	listItem.add(map);
            }
     
            SimpleAdapter mSchedule = new SimpleAdapter (context, listItem, R.layout.row_position,
                    new String[] {"name","valuation","pc_port","pc_sect"},
                    new int[] {R.id.tvRowPos_name,R.id.tvRowPos_valuation,R.id.tvRowPos_pc_port,R.id.tvRowPos_pc_sect});
     
             //On attribut à notre listView l'adapter que l'on vient de créer
             listViewPositions.setAdapter(mSchedule);
     
             listViewPositions.setOnItemClickListener(new OnItemClickListener() {			
    			@Override
    			public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
    					long arg3) {
    				Log.d("tag","clic");
     
    			}
    		});
             convertView.setVisibility( View.VISIBLE);
     
     
    		return convertView;
    	}

  2. #2
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 345
    Points : 103
    Points
    103
    Par défaut
    Bonjour,

    je ne comprend pas bien pourquoi tu met une ListView dans une ExpandableListView, quel est le but ?

    Vu que si tu alimentes correctement ton expandableListView tu peux créer autant d'item child que tu as d'informations, sachant que l'item child tu peux le définir avec un fichier xml.

    Je ne comprend pas trop pourquoi tu aurais besoin de mettre une ListView dans une expandableListView, tu as certainement une raison, mais moi là je ne vois pas trop pourquoi. Mais c'est peut être moi le problème et pas le fait que tu mets une ListView dans une expandableListView

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2011
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2011
    Messages : 67
    Points : 87
    Points
    87
    Par défaut
    Parce que j'ai 3 niveaux d'information et non pas 2. Idéalement je pourrais même mettre une ELV dans une ELV mais je n'en ai pas besoin.

    En résumé j'ai des Catégories, Sous-Catégories et puis des Objets.

    L'utilisateur doit pouvoir "déplier" les catégories et obtenir toutes les sous catégories et objets. Chaque "child" d'une catégorie est donc une sous-catégorie. Pour chaque "child" je crée donc une LV dont le header est la sous-catégorie et dont les propres "child" sont les objets.

    Cette structure correspond à celle de mes données donc c'est également censé être plus simple.

    Lionel

  4. #4
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 345
    Points : 103
    Points
    103
    Par défaut
    Vu comme ça, pourquoi pas.

    Pour ce qui s'agit de ton bug je ne sais pas trop à vrai dire.

  5. #5
    Expert éminent

    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
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Prendre le code de ExpandableListView, et le rendre capable de gérer 3 niveaux ?

    Il ne faut pas hésiter parfois à surcharger les widgets de base d'Android...
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  6. #6
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2011
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2011
    Messages : 67
    Points : 87
    Points
    87
    Par défaut
    Mhhh en effet, il faudrait que j'aille voir de ce côté. J'avoue ne pas être à l'aide en ce qui concerne la customisation des View existantes. Si vous aviez un petit tutorial à me proposer, je suis preneur.

    Je ne pourrai en effet pas attendre la Droidcon et cette présentation pour customiser mes premières View

    D'avance merci.

    Lionel

  7. #7
    Expert éminent

    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
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Sans tutorial... il n'y a rien de plus simple....


    Commence par faire ta classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    class ThreeLevelsListView extends ExpandableListView
    {
       ... rajoute les constructeurs de ExpandableListView ici (Eclipse bouton droit / sources / generate constructors from super class)
    }
    Ensuite remplace dans le layout "ExpandableListView" par "com.mypackage.ThreeLevelsListView" et le tour est joué....

    Ensuite par petits bouts tu fais des modifications.
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  8. #8
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2011
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2011
    Messages : 67
    Points : 87
    Points
    87
    Par défaut
    Je n'ai pas de soucis à comprendre l'héritage (heureusement d'ailleurs), mais faut-il encore savoir quelles méthodes Overrider et/ou Surcharger et savoir à quoi elles servent ...

    De ce côté là, une lecture plus complète de la documentation devrait m'aider me diras-tu :-)

  9. #9
    Expert éminent

    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
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Et surtout du code....

    Voir ce que ExpandableListView surcharge peut aider
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  10. #10
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2011
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2011
    Messages : 67
    Points : 87
    Points
    87
    Par défaut
    En fait le problème est un problème d'affichage.

    Ma ListView est complète MAIS l'espace qui lui est réservé pour s'afficher est l'espace d'un seul de ses éléments et donc il y a moyen de scroller pour voir les autres.

    J'ai essayé plusieurs configuration de wrap_content / fill_parent mais rien n'y fait, je n'arrive pas à faire en sorte que la ListView prenne toute la place dont elle à besoin ...




    PS: Le "mini projet" test en pièce jointe
    Fichiers attachés Fichiers attachés

  11. #11
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2011
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2011
    Messages : 67
    Points : 87
    Points
    87
    Par défaut
    Après des recherches plus précises, j'ai trouvé la solution qui était en effet de modifier quelques peu l'implémentation de l'élément child de l'ExpandableListView.

    Il faut que celui-ci (re)calcule ses dimensions correctemment) et signale ce changement à l'ELV qui l'englobe.

    Il faut donc surcharger particulièrement la méthode suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec) {
    ...
    }


    C'est ce sujet : http://mylifewithandroid.blogspot.be...ble-lists.html qui m'a aidé à trouver la solution. Il solutionne le problème avec une ELV dans une ELV mais c'est évidemment valable également avec une LV dans une ELV.

    Merci pour votre aide !

    Lionel

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Listview dans une PreferenceActivity ?
    Par PiXkIl dans le forum Composants graphiques
    Réponses: 0
    Dernier message: 16/01/2010, 12h41
  2. Réponses: 4
    Dernier message: 27/10/2009, 11h14
  3. Accès à listview dans une fonction avec borland builder 5
    Par xasmxasm dans le forum C++Builder
    Réponses: 4
    Dernier message: 13/05/2008, 20h16
  4. [VB.NET] inserer valeurs de Listview dans une table
    Par snoopdam dans le forum Accès aux données
    Réponses: 1
    Dernier message: 17/04/2007, 11h11
  5. Réponses: 8
    Dernier message: 12/05/2006, 14h04

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