2010-09-11 8 views
2

J'ai deux listes d'étincelles avec des éléments de rendu personnalisés. Je travaille sur une application qui permet aux utilisateurs de faire glisser ces Renderers d'une liste à l'autre. Lorsque l'un de ces IR est déposé dans une nouvelle position ou dans une autre liste, je mets à jour les fournisseurs de données: je supprime l'objet du fournisseur de données d'une liste et l'ajoute au fournisseur de données de l'autre. Cela fonctionne bien.Éviter la mise en cache d'ItemRender dans une liste d'étincelles dans Flex 4

Le problème est que parfois l'IR est mis en cache et ne montre pas les informations correctes, en fonction de ses données.

Comment puis-je forcer les listes à ne jamais mettre en cache les IR, de sorte que chaque fois que je modifie le fournisseur de données, tous les rendus d'éléments recréent tous les IR. Les performances ne seront pas un problème puisque j'ai peu d'éléments sur chaque liste.

Répondre

1

Flextras a quelques bons points, mais pour répondre à votre question spécifique, vous pouvez définir useVirtualLayout sur false sur Spark Lists. Cela assurera qu'il y a un moteur de rendu pour chaque élément de votre liste et éviter ainsi les problèmes de recyclage. Vous ne devriez vraiment faire cela que lorsque vous avez une liste relativement courte d'éléments, sinon vous aurez des problèmes de performance, qui, comme Flextras l'a noté, est la raison pour laquelle Flex recycle les moteurs de rendu.

+0

ont fonctionné parfaitement. Merci. – oscarm

3

Quelques choses ..

1) ItemRenderers doivent toujours être mises en cache [et]. Réutilisés C'est l'un des avantages de l'utilisation d'une liste Flex en premier lieu. Je soupçonne que votre itemRenderer est correctement implémenté pour ne pas changer quand il y a des changements de données. Si vous partagez du code pour cela, ce serait utile. Mais, fondamentalement, votre itemRenderer doit écouter l'événement dataChange et lorsque les données changent, vous devez mettre à jour l'affichage visuel du composant avec de nouvelles données.

2) Dans Flex 3, j'aurais juré que glisser un élément d'une liste à une autre automatiquement mis à jour les fournisseurs de données pertinentes. Êtes-vous sûr de devoir écrire du code manuel pour effectuer ces changements? Vous aurez cependant besoin de code pour mettre à jour votre backend si nécessaire.

+0

Bonne suggestion d'ajouter du code pour forcer la réactualisation de l'événement DataChange, j'avais une liste de 50 éléments, Le ItemRenderer contient plusieurs composants et l'un de ceux peint lui-même en utilisant l'objet Graphics, en raison de la mise en cache de ce composant n'a pas mis à jour, mais les autres composants comme les étiquettes mises à jour – simion314

0

Je mis une méthode de remise à zéro dans mes données définies pour assurer les variables renderer sont réinitialisés

override public function set data(object:Object):void 
{ 

if (object == null) 
{ 
    return; 
} 

reset(); // reset locals to their base. ie. x=0, y=0, counter=0 

    // set up renderer using data   

}