2010-10-26 70 views
4

Dans Flex, je peux créer un ItemRenderer pour représenter chaque élément dans le DataProvider Lists mais comment puis-je accéder à l'instance de ItemRenderer via l'objet DataProviders? Quelque chose comme myList.getItemRenderer(dp.getItemAt(10));Comment puis-je obtenir le ItemRenderer d'une liste Flex Spark à partir de son objet DataProvider?

+2

Étant donné qu'une liste Flex recycle ses rendus d'éléments par défaut, vous ne pourrez pas accéder de manière fiable à un rendu d'élément pour un objet de données donné. Il se peut qu'il n'y ait même pas de moteur de rendu associé à l'objet de données s'il est déplacé en dehors de la zone visible de la liste. Qu'est-ce que vous essayez d'accomplir? –

Répondre

15
public function getItemRenderer(list:List, item:Object):ItemRenderer 
{ 
    var dataGroup:DataGroup = list.dataGroup; 
    var n:int = dataGroup.numElements; 
    for (var i:int = 0; i < n; i++) 
    { 
     var renderer:ItemRenderer = dataGroup.getElementAt(i) as ItemRenderer; 
     if (renderer && renderer.data == item) 
      return renderer; 
    } 
    return null; 
} 
+0

Merci beaucoup, j'avais besoin de quelque chose comme ça. – ccsakuweb

+0

Pour que cela fonctionne tout le temps, vous devez définir useVirtualLayout de la liste sur false. De cette façon, tous les ItemRenderers seront créés même s'ils ne sont pas visibles. Avec useVirtualLayout true, certains ItemRenderers ne seront créés que lorsqu'ils seront visibles. – DoomGoober

1

En utilisant cette méthode, vous ne pouvez pas obtenir le moteur de rendu qui est en dehors de la zone visible et il y aura aussi beaucoup d'autres questions.

+0

Vous avez raison. J'ai désélectionné la réponse précédente mais je serais ravi de trouver une solution pour cela. –

+0

Il n'y a pas de «bonne» réponse à cette question, car Flex SDK ne prend pas en charge l'accès direct au rendu par les données. –

1

Si vous devez modifier le comportement du rendu d'élément, modifiez les données à l'origine du comportement.

var items:ArrayCollection = this.dataProvider as ArrayCollection; 
    var newItems:ArrayCollection = new ArrayCollection(); 
    if (items.length > 0) { 
     for (var i:int = 0; i < items.length; i++) { 
      var item:Object = items[i] as Object; 

      if (!item.editMode) { 
       item.editMode = true; 
      } else { 
       item.editMode = false; 
      } 

      newItems.addItem(item); 
     } 
    } 

    this.dataProvider = null; 
    this.dataProvider = newItems; 

Ceci est un exemple simple où les articles de marque I pour être supprimables et les changements renderer selon puisque les données ont été modifiées. Pour les ensembles de données plus volumineux, je comprends que cela peut être un peu lent, mais cela vous donne le contrôle que vous recherchez.

Si vous devez modifier un rendu, modifiez simplement les données sur l'objet correspondant dans le DataProvider ou le DataGroup.

var item:Object = this.getItemAt(index); 
0

Je sais que c'est un vieux fil, mais peut-être pour aider quelqu'un:

var item:ItemRenderer = list.dataGroup.getElementAt(0) as ItemRenderer; 

Cela vous donnera la ItemRenderer, si vous avez une coutume IR puis il suffit d'utiliser cette classe et acteurs et votre ensemble.