2009-04-16 5 views
3

J'écris un client Adobe Air à un service similaire à Twitter.Re-mesure du rendu d'élément personnalisé sur une liste

Sur le scénario (composant Liste) J'ai un rendu d'élément personnalisé qui est essentiellement un canevas avec une image de largeur fixe et un contrôle de texte, qui est multiligne. Si le texte est suffisamment long pour modifier la hauteur du canevas, il ne sera redimensionné que si je modifie manuellement la largeur de la fenêtre, ce qui oblige à redessiner tous les rendus. Si je fais simplement défiler la liste, tous les nouveaux moteurs auront la hauteur minimale possible (qui est la hauteur de l'image).

Des idées sur la façon de forcer la re-mesure du moteur de rendu lorsque je définis ses données?

Merci d'avance! :)

Répondre

0

essayer d'appeler invalidateSize() sur le itemrender, et/ou invalidateDisplayList() sur la liste

+0

J'ai déjà essayé. Sans succès. – leolobato

+0

Je me souviens avoir lutté avec quelque chose de similaire, mais je ne trouve pas le code. Essayez d'appeler invalidateDisplayList() sur une autre image en utilisant la fonction callLater. Vous pouvez également essayer validateNow(). Désolé, je ne peux pas vous donner une solution spécifique. – rogueg

0

Avez-vous essayez de définir variableRowHeight=true pour la liste?

+0

Je l'ai fait. Il se redimensionne correctement si je change la largeur de la fenêtre.Je veux juste qu'il recalcule et taille correctement quand je fais défiler la liste. – leolobato

+0

que diriez-vous de régler la hauteur de la toile et du texte à 100% – Amarghosh

0

Si vous gérez l'événement updateComplete, vous pouvez recalculer la taille à cet endroit. Il est probablement plus de kill depuis updateComplete se produit chaque fois que l'itemrenderer est dessiné mais cela fonctionne.

0

Vous devez d'abord définir variableRowHeight à true;
Dans votre itemRenderer, vous devez désactiver verticalScrollPolicy (je suppose que vous l'avez déjà fait), et faire de même pour le contrôle de texte. Réglez également la hauteur du texte à 100%. Je ne l'ai pas essayé dans Flex4, mais dans les versions antérieures je devais avoir une VBox en tant que root pour le itemRenderer afin de le redimensionner en fonction du contenu de son texte, donc vous devriez envisager d'utiliser une instance VBox/VGroup au lieu de Canvas.

0

J'ai rencontré un problème très similaire avec le redimensionnement des rendus d'éléments dans une grille de données en utilisant des étiquettes qui doivent se dimensionner en fonction du texte. Le problème est qu'il nécessite deux passages pour un composant texte multiligne pour se mettre à jour correctement. Cela fonctionne pour la plupart des contrôles car ils sont continuellement mis à jour et positionnés. Il échoue dans une liste ou une grille parce que la première mise à jour quand un changement se produit oblige la liste à mesurer les rendus d'éléments, puis il définit la hauteur de sa rangée en fonction du résultat retourné. Le rendu de l'élément se met alors à jour la seconde fois (se mesurant correctement cette fois) mais la liste ne cherche pas les changements de mise à jour. J'ai pris pour valider de force l'étiquette (contrôle de texte) dans le passage de mesure pour obtenir la taille du composant de texte correctement ainsi le moteur de rendu indiquerait la taille mesurée correcte la première passe de mise à jour après n'importe quel changement. Mes quêtes (et ma prochaine answer anser et quelques discussions) sont ici: ItemRenderer hieght (and height changes) not reflected in AdvancedDataGrid row

Questions connexes