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