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 :

Création dynamique de layout vs inflate


Sujet :

Composants graphiques Android

  1. #1
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut Création dynamique de layout vs inflate
    Bonjour,

    Pour des questions de centralisations et de souplesses du code, dans certaines situations je créé mes layout dynamiquement notamment pour des items de ListView.

    Typiquement:

    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
    public class TViewLVItem extends LinearLayout {
     
        /*== VARIABLES GENERALES ==*/
     
     
        protected Context context;
        public ArrayList<TextView> lTextViews;
        public int iType; // pour utilisation exterieure, type du layout (détail, titre etc...)
     
     
        /*== CONSTRUCTEURS ET SURCHARGES ==*/
     
     
        public TViewLVItem(Context context, int iNbTextView ) {
            super(context);
            this.context = context;
            lTextViews = new ArrayList<TextView>();
     
     
            // Parametrage du layout
            this.setOrientation( HORIZONTAL );
     
     
            // construction des TextView
            TextView textView;
            for ( int i = 0; i < iNbTextView; i++ ) {
                textView = new TextView( context );
                if ( i < ( iNbTextView - 1 ) )
                    this.addView( textView, new LinearLayout.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT ) ); else
                    this.addView( textView, new LinearLayout.LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT ) );
                lTextViews.add( textView );
            }
        }
    ...
    et dans un adapter 'extends BaseAdapter' je l'utilise de cette manière
    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
     
            @Override
            public View getView(int iPos, View view, ViewGroup viewGroup) {
                TViewLVItem viewLigne = (TViewLVItem)view;
                cursor.moveToPosition(iPos);
                if ( view == null )
                    viewLigne = creerLigneNormale();
                viewLigne.setText( cursor );
                return viewLigne;
            }
     
     
            protected TViewLVItem creerLigneNormale() {
                TViewLVItem viewLigne = new TViewLVItem( context, 2 );
                viewLigne.setDims( new int[]{ 20, 60 } );
                return viewLigne;
            }
    au lieu du traditionnel inflater.inflate( resource layout xml).


    Cette méthode a pour moi beaucoup d'avantages:
    - toutes mes ListView auront le même style, quelque soit mon nombre de colonnes des mes ListView créées
    - moins de fichiers xml représentant chaque item de ListView
    - et également accès rapide au TextView, évitant de réaliser une sorte de cache dans l'adapter pour éviter des findByView sur les TV du layout à outrance.
    - et au niveau lisibilité du code je trouve aussi cela nettement plus clair et réutilisable


    Je n'ai pas constaté visuellement de différence de vitesse (ListeView de 1000 lignes, avec 4 colonnes TV par exemple)
    entre cette utilisation et l'utilisation d'un layout XML chargé avec un inflater.
    Mais ce n'est que visuel et sur mon mobile... d'ou ma question pour ne pas avoir de surprise plus tard...

    Est-ce que la création dynamiqe d'un layout et de ses composants est plus lent que le chargement (que je suppose optimisé) par un inflater.inflate( res. xml) ?
    si oui, avez vous un ordre de grandeur x1.1 x10 x100 ?

    merci
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  2. #2
    Membre extrêmement actif
    Profil pro
    Développeur
    Inscrit en
    Mars 2012
    Messages
    1 969
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2012
    Messages : 1 969
    Points : 3 375
    Points
    3 375
    Par défaut
    Est-ce que la création dynamiqe d'un layout et de ses composants est plus lent que le chargement (que je suppose optimisé) par un inflater.inflate( res. xml) ?
    si oui, avez vous un ordre de grandeur x1.1 x10 x100 ?
    Je crée également mon layout par code.
    Dans le passé, j'avais à chaque fois des bugs avec les xml et alors j'ai testé cette méthode.

    Effectivement, il doit y avoir un impact au niveau de l'utilisation mémoire.
    Perso, je n'ai pas des listes énormes donc c'est difficile à dire pour 1000 items.
    Si la réponse vous a aidé, pensez à cliquer sur +1

  3. #3
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    oui il y a également le coté prise de ressources. Mais je ne pense pas qu'un objet layout créé
    dynamiquement prennent beaucoup plus de place qu'un XML (quoique??? je sais pas du tout à vrai dire)

    Mais quoi qu'il en soit, que la liste fasse 100 ou 10000 items, ça ne devrait rien changer dans un cas comme dans l'autre car à ce que j'ai compris
    les layouts sont ré-utilisés et le nombre d'instanciations est limité (géré au mieux par le système, nombre d'items affichables + delta certainement).
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  4. #4
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    Tu utilises le principe du "holder" pour les ListView, ce qui est préconisé justement. Une cellule n'est créée qu'une fois, et est réutilisée ensuite. Donc niveau perf, ce que tu fais est équivalent à l'utilisation par XML.
    Je pense que la créa dynamique est un poil plus lente, mais sauf avoir des objets complexes, je ne pense pas que ça se ressente. Il faudrait essayer sur des veaux (style une Galaxy Tab 1ère génération).

    De mon côté, je préfère de loin passer par les XML, uniquement pour le rendu temps réel. Je n'aime pas l'éditeur WYSIWYG.
    Pour les apparences, j'utilise des styles et des thèmes, qui sont fait pour ça.
    Avoir "trop" de XML ne me dérange pas, vu que je ne navigue pas "à la main" dedans, mais je passe toujours par de l'ouverture de ressource, il faut par contre bien les nommer pour éviter d'être submergée ou que ce soit le foutoir.
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  5. #5
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    Citation Envoyé par Hizin Voir le message
    Je pense que la créa dynamique est un poil plus lente, mais sauf avoir des objets complexes, je ne pense pas que ça se ressente. Il faudrait essayer sur des veaux (style une Galaxy Tab 1ère génération).
    C'est exactement ce que je pensais mais ça me rassure un peu d'avoir des confirmations. Et comme j'utilise la création dynamique pour des items et pas pour des écrans entiers, ce ne sera jamais très complexe.

    (et puis j'ai pas de veau à la maison )

    Merci pour vos réponses !
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

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

Discussions similaires

  1. Création dynamique TADOConnection
    Par chaours dans le forum Bases de données
    Réponses: 6
    Dernier message: 19/04/2004, 10h54
  2. [D7] Création dynamique de Form
    Par jer64 dans le forum Composants VCL
    Réponses: 3
    Dernier message: 03/08/2003, 12h20
  3. [Rave Report] problème de création dynamique
    Par Nivux dans le forum Rave
    Réponses: 2
    Dernier message: 24/05/2003, 00h07
  4. TWebBrowser et création dynamique
    Par BakaOnigiri dans le forum Web & réseau
    Réponses: 2
    Dernier message: 01/09/2002, 10h53
  5. Création dynamique de TImages
    Par Dric dans le forum C++Builder
    Réponses: 10
    Dernier message: 08/07/2002, 12h36

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