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:
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
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 ); } } ...
au lieu du traditionnel inflater.inflate( resource layout xml).
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; }
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
Partager