Pregunta

Me encuentro con un problema extraño con itemRenderers dentro de una TileList.

Aquí hay un ejemplo de trabajo sin itemRenderer: 152.org/flex/

Aquí está la versión rota con un itemRenderer: 152.org/brokenExample/
(no tengo el representante para hacer que ambos sean un enlace)

Ambos ejemplos tienen " Ver código fuente " habilitado.

Para ver el problema, use el ejemplo roto, seleccione un álbum y desplácese hacia abajo una fila. Desplácese hacia arriba y las imágenes se cambiarán. Si intenta esto en el ejemplo de trabajo, está bien.

Esto parece ser un error ampliamente conocido, pero no puedo encontrar una solución para ello.

ACTUALIZACIÓN
Empecé a jugar con este ejemplo nuevamente y descubrí algo más. Resulta que no tienes que anular el configurador de datos. Puede crear un nuevo método en el itemRenderer que se establece cada vez que el mosaico desea actualizar. Entonces, el truco es no confiar en los métodos initialize o creationComplete.

Esto es lo que tengo para el itemRenderer en la Aplicación.

<itemRenderers:ImageTile img="{data}"/>

Este es el código que tengo en el itemRenderer.

public function set img(value:String) : void {
  trace("setting source: " + value);
  this.source = value;
  this.name = value.toString().split("/").pop().split(".").shift();
}

Actualicé mi ejemplo para reflejar este cambio.

¿Fue útil?

Solución

No tengo tu aplicación a mano, así que no puedo probar de principio a fin, pero he mirado tu fuente. Probablemente necesite anular la configuración de datos en su itemRenderer:

<?xml version="1.0" encoding="utf-8"?>
<mx:Image xmlns:mx="http://www.adobe.com/2006/mxml" initialize="init()">

 <mx:Script>
  <![CDATA[

   override public function set data(value:Object):void
   {
    super.data = value;
    this.source = data;
    this.name = data.toString().split("/").pop().split(".").shift();
   }

   private function init() : void {
    // Removed from your source and transplanted above
   }

  ]]>
 </mx:Script>

</mx:Image>

Flex intentará reutilizar los procesadores de elementos en las listas (lo que significa que los eventos del ciclo de vida que podría estar esperando (inicializar, creación completa, etc.) no siempre se activarán, por lo que si desea asegurarse de que su procesador se actualiza cuando cambia el elemento de datos (como lo hará cuando ocurren eventos de desplazamiento), la mejor práctica es anular la propiedad de datos del renderizador. Lo más probable es que solucione el problema.

Otros consejos

¿Quizás intente invalidar en la creaciónCompletar?

Por lo que recuerdo con DataGrids (que funcionan de manera similar a una lista de mosaicos), cuando un elemento se enfoca, se recrea.

<mx:itemRenderer>
  <mx:Image id="myImage" creationComplete="myImage.invalidate()" />
</mx:itemRenderer>

No he probado este código, pero creo que aquí es donde quieres comenzar a buscar. Eché un vistazo a su componente itemRenderer. Intente creationComplete en lugar de inicializar para llamar a su función

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top