Bonjour,
Dans le cadre de la construction d'une ExpandableListView (ELV) à plusieurs niveaux (voir mon post précédent), j'ai besoin à un moment de récupérer / fixer la taille de l'ELV qui est imbriquée dans la première.
Dans le tutoriel trouvé (ici), on calcule en fait cette taille en "comptant" le nombre de lignes qui vont être affichées dans chaque groupe qui est "expand". Ensuite comme toutes les lignes "child" et "group" sont de taille fixe on peut facilement calculer la taille de l'ELV complète.
Dans mon cas, je voudrais quelque chose de plus dynamique, car les vues construites par getChildView() et getGroupView() peuvent avoir des tailles différentes.
Malheureusement je n'arrive pas à récupérer la taille des différentes vues que je construis. getHeight() me renvoie systématiquement 0. Ce qui est plus que probablement causé parce que :
"Be aware not to call getWidth() or getHeight() too early before the view have been laid out on the screen, otherwise "0" will be returned."
Je ne sais pas trop comment m'y prendre ...
Actuellement je fais ceci :
Dans l'Adapter de mon ELV, quand je construit mon "Embedded 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 public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { ExpListAssetSubCatAdapter adapter = new ExpListAssetSubCatAdapter( context, (AssetSubCat) getChild(groupPosition, childPosition)); /* Dans cette méthode j'appelle une fois getChildView() et getGroupView() pour toutes les lignes, et ainsi générer un "cache" de ces vues. J'espérais qu'en les générant "plus tôt",getHeight() me donne une autre valeur que 0 ... Mais ça ne marche pas */ adapter.initDebug(); expList = new EmbeddedExpListView(context); int testHeight = calculateHeight(adapter); expList.forceHeight(testHeight); expList.setAdapter(adapter); int nb = expList.getCount(); for (int i = 0; i < nb; i++) { expList.expandGroup(i); } expList.requestLayout(); } return expList;EmbeddedExpListView
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 private int calculateHeight(ExpListAssetSubCatAdapter adapter) { if (adapter == null) { return 0; } else { int calculatedHeight = 0; int groupCount = adapter.getGroupCount(); for (int groupPosition = 0; groupPosition < groupCount; groupPosition++) { calculatedHeight += adapter.getGroupView(groupPosition, false, null, null).getHeight(); int childCount = adapter.getChildrenCount(groupPosition); for (int childPosition = 0; childPosition < childCount; childPosition++) { calculatedHeight += adapter.getChildView(groupPosition, childPosition, false, null, null).getHeight(); } } return calculatedHeight; } }
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 class EmbeddedExpListView extends ExpandableListView { private int height; public EmbeddedExpListView(Context context) { super(context); // TODO Auto-generated constructor stub } /** * Recalcule la hauteur de l'ELV. */ public void forceHeight(int newHeight) { height = newHeight; } protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); setMeasuredDimension(getMeasuredWidth(), height); }
Je ne suis pas contre un peu d'aide :-)
Lionel
Partager