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

Android Discussion :

Créer une nouvelle instance de vue en utilisant findViewById dans une boucle


Sujet :

Android

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2007
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2007
    Messages : 142
    Points : 52
    Points
    52
    Par défaut Créer une nouvelle instance de vue en utilisant findViewById dans une boucle
    Bonjour à tous,

    J'ai créer une custom relativeLayout puis je crée des vues dynamiquement au fur et à mesure des données que je reçois.
    voici un example de code:
    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
     for (int i = 0; i <3; i++) {
                RelativeLayout firstLayout = new RelativeLayout(this);
                RelativeLayout.LayoutParams firstLayoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,RelativeLayout.LayoutParams.WRAP_CONTENT);
                firstLayout.setId(1 +i);
                firstLayoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
                firstLayoutParams.addRule(RelativeLayout.BELOW, firstLayout.getId() -1);
                firstLayoutParams.setMargins(0, 20, 0, 0);
                firstLayoutParams.addRule(RelativeLayout.ALIGN_LEFT, firstLayout.getId() -1);
     
                firstLayout.setLayoutParams(firstLayoutParams);
     
                ImageView imageView = new ImageView(this);
                imageView.setImageDrawable(getResources().getDrawable(R.drawable.play_station_4));
                RelativeLayout.LayoutParams imageViewParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,RelativeLayout.LayoutParams.WRAP_CONTENT);
                imageView.setId(1);
                imageViewParams.addRule(RelativeLayout.ALIGN_LEFT);
                imageViewParams.addRule(RelativeLayout.ALIGN_TOP);
                imageView.setLayoutParams(imageViewParams);
     
     
                TextView title_txt = new TextView(this);
                RelativeLayout.LayoutParams title_txtParams = new RelativeLayout.LayoutParams(250,RelativeLayout.LayoutParams.WRAP_CONTENT);
                title_txtParams.addRule(RelativeLayout.RIGHT_OF, imageView.getId());
                title_txtParams.addRule(RelativeLayout.ALIGN_TOP);
                title_txt.setId(8);
                title_txt.setLayoutParams(title_txtParams);
                title_txtParams.setMargins(10, 0, 0, 0);
                title_txt.setText("Sisley Chantal, sac porté main - Noir (Black, Taille unique)");
     
                TextView price_txt = new TextView(this);
                RelativeLayout.LayoutParams price_txtParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,RelativeLayout.LayoutParams.WRAP_CONTENT);
                price_txtParams.addRule(RelativeLayout.RIGHT_OF, title_txt.getId());
                price_txtParams.addRule(RelativeLayout.ALIGN_TOP);
                price_txt.setId(5);
                price_txt.setLayoutParams(price_txtParams);
                price_txtParams.setMargins(20, 0, 0, 0);
                price_txt.setText("EUR 75,00");
     
     
                TextView quantity_txt = new TextView(this);
                RelativeLayout.LayoutParams quantity_txtParams = new RelativeLayout.LayoutParams(50,50);
                quantity_txtParams.addRule(RelativeLayout.ALIGN_LEFT,title_txt.getId());
                quantity_txtParams.addRule(RelativeLayout.BELOW, title_txt.getId());
                quantity_txt.setId(54);
                quantity_txt.setLayoutParams(quantity_txtParams);
                quantity_txtParams.setMargins(10, 10, 0, 0);
                quantity_txt.setText("2");
     
     
                firstLayout.addView(quantity_txt);
                firstLayout.addView(title_txt);
                firstLayout.addView(price_txt);
                firstLayout.addView(imageView);
     
                relativeLayout.addView(firstLayout, firstLayoutParams);
    		}

    Je trouve que c'est peu lisible même si ça fonctionne parfaitement, donc je voudrais m'orienter vers une approche en xml et je sais qu'on peux ajouter un layout à ma customRelativeLayout en faisant un inflate de ce dernier dans le constructeur.

    Ce que je cherche actuellement c'est crée une nouvelle instance de vue dans une boucle avec findViewById.

    par exemple dans la boucle précédente j'aurais quelque chose qui ressemble à ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for (int i = 0; i <3; i++) {
    ImageView img =  (ImageView)findViewById(R.id.mon_image_view);
    }
    Mais le fait est que j'ai toujours la même instance de vue à chaque itération. Est ce que cette approche est possible à votre avis ? Je voudrais reproduire le même mécanisme que dans une listView sans le recyclage de vue.
    Merci de votre aide.

  2. #2
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2013
    Messages : 149
    Points : 196
    Points
    196
    Par défaut
    Crée un array de imageview et à chaque itération ajoute ta vue dans l'array.Commme ça il te suffit de récupérer la vue grâce a la position de celle ci.

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2007
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2007
    Messages : 142
    Points : 52
    Points
    52
    Par défaut
    Très bonne idée c'est valable pour toutes les vues je supposes ?
    Merci pour votre réponse

  4. #4
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2013
    Messages : 149
    Points : 196
    Points
    196
    Par défaut
    Pour citer la doc :
    All elements are permitted, including null.
    donc oui

  5. #5
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2007
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2007
    Messages : 142
    Points : 52
    Points
    52
    Par défaut
    Supposons que dans mon layout j'ai plusieurs type de vue ImageView, TextView et Button, dois je créer un type de tableau pour chaque vue ?
    par exemple:
    ImageView[],TextView[], Button[] ou bien est ce que je peux créer simplement un tableau View[] ?

  6. #6
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2013
    Messages : 149
    Points : 196
    Points
    196
    Par défaut
    Ba tu peux créer un tableau pour chaque type mais moi je pensais plutôt à une ArrayList, normalement ça te permet de stocker n'importe quel type d'élément dans la même liste.

  7. #7
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2007
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2007
    Messages : 142
    Points : 52
    Points
    52
    Par défaut
    Il me semble que tu dois spécifier le type de ArrayList n'est ce pas ?

  8. #8
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2013
    Messages : 149
    Points : 196
    Points
    196
    Par défaut
    Si tu la déclare comme ça normalement non :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ArrayList al = new ArrayList();
        al.add(12);
        al.add("Une chaîne de caractères !");
        al.add(12.20f);
        al.add('d');

  9. #9
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2007
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2007
    Messages : 142
    Points : 52
    Points
    52
    Par défaut
    alors effectivement le problème viens d'autre part, en effet combien même j'arrive à créer des vues en faisant inflate, comment je fait pour ajouter les vues créer dans mon OrderDetailRelativeView, car lorsque je fait addview(view) j'ai une exception

  10. #10
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2013
    Messages : 149
    Points : 196
    Points
    196
    Par défaut
    Je suis pas sur de comprendre le problème.
    En gros tu fais :
    ArrayList a = new ArrayList();
    a.add(new TextView....)
    et quand tu veux l'afficher ou la modifier
    layout.addview(a.get(x)); avec x la position de ta vue

  11. #11
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2007
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2007
    Messages : 142
    Points : 52
    Points
    52
    Par défaut
    En fait c'est une classe qui dérrive de RelativeLayout. Dans ces 3 constructeurs j'attache mon layout au root.
    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
    	public OrderDetailRelativeView(Context context, AttributeSet attrs) {
    		super(context, attrs);
    LayoutInflater inflater = LayoutInflater.inflate.from(context);
    inflater.inflate(R.layout.order_detail_relative_layout, this, true);
     
    	}
     
    	public OrderDetailRelativeView(Context context) {
    		super(context);
    LayoutInflater inflater = LayoutInflater.inflate.from(context);
    inflater.inflate(R.layout.order_detail_relative_layout, this, true);
    	}
     
    	public OrderDetailRelativeView(Context context, AttributeSet attrs,
    			int defStyleAttr) {
    		super(context, attrs, defStyleAttr);
    LayoutInflater inflater = LayoutInflater.inflate.from(context);
    inflater.inflate(R.layout.order_detail_relative_layout, this, true);
    	}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     public void initUI(){
    for (int i = 0; i <3; i++) {
    ImageView img =  (ImageView)findViewById(R.id.mon_image_view);
    }
    }
    Donc lorsque je vais instancier OrderDetailRelativeView depuis l'extérieur, je vais appelé une fonction initUI() qui s'occupera d'initialiser mes vues, et c'est à ce moment la que je voudrais utilise findViewById dans une boucle.

  12. #12
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2013
    Messages : 149
    Points : 196
    Points
    196
    Par défaut
    Ba tu déclare ton Arraylist en variable globale
    dans ta fonction initUI tu fait arraylist.add(img);
    c'est quoi ton exception ?

  13. #13
    Expert confirmé
    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
    Points : 4 166
    Points
    4 166
    Par défaut
    J'ai pas tout suivi en détail mais pour ta première question, toutes tes vues ayant le même Id, c'est normal que findViewById renvoies toujours la même chose. Je rappelle que tu es responsable d'affecter des Id aux vues avec setId(). Tu peux utiliser un générateur d'Id si tu n'es pas inspiré.

    Mais tout ce système d'Ids n'est finalement pas très utile si tu créés dynamiquement des vues : contentes-toi de conserver les références à ces Vues pour les manipuler ensuite. Ceci n’amène à la seconde partie : toutes les vues hérites de la classe View, donc un ArrayList<View> te permet de stocker indifféremment des références à des layouts, boutons, cases à cocher, etc... Enfin, ne pas paramétrer ArrayList reviens à faire ArrayList<Object> ce qui est bien trop général pour être utile.
    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

Discussions similaires

  1. [XL-2010] Suppression d'une ligne dans une feuille A tout en garder les infos dans une feuille B
    Par sebastien_ofs dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 20/01/2015, 12h10
  2. Réponses: 13
    Dernier message: 23/05/2013, 20h38
  3. Oracle dans une nouvelle bataille juridique sur l'utilisation du Java
    Par Hinault Romaric dans le forum Général Java
    Réponses: 16
    Dernier message: 17/12/2010, 16h01
  4. Oracle dans une nouvelle bataille juridique sur l'utilisation du Java
    Par Hinault Romaric dans le forum Actualités
    Réponses: 14
    Dernier message: 16/12/2010, 17h30
  5. Réponses: 1
    Dernier message: 31/08/2009, 22h48

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