Pergunta

Eu estou correndo em um problema estranho com itemRenderers dentro de um TileList.

Aqui está um exemplo de trabalho sem um itemRenderer: 152.org/flex /

Aqui é a versão quebrado com um itemRenderer: 152.org/brokenExample/
(eu não tenho o representante para fazer ambos uma ligação)

Ambos os exemplos têm "View Source" habilitado.

Para ver o problema usar o exemplo quebrado, selecione um álbum e de rolagem para baixo uma linha. Rolar para cima e as imagens serão trocados. Se você tentar isso no exemplo de trabalho que está bem.

Este parece ser um bug amplamente conhecida, mas não consigo encontrar uma solução para ele.

Atualizar
Comecei a jogar com este exemplo novamente e descobri outra coisa. Acontece que você não tem que substituir o setter de dados. Você pode criar um novo método no itemRenderer que é definido sempre que a telha quer atualizar. Portanto, o truque é não contar com a inicializar ou métodos creationComplete.

Isto é o que eu tenho para o itemRenderer na aplicação.

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

Este é o código que eu tenho no itemRenderer.

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

eu atualizei meu exemplo para reflexo dessa mudança.

Foi útil?

Solução

Eu não tenho a sua aplicação prática, portanto, eu não posso teste end-to-end, mas eu olhei para a sua fonte. Você provavelmente precisará substituir os dados setter em sua 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 tentará re-uso representantes de itens em listas (o que significa que os eventos de ciclo de vida que você pode estar esperando - initialize, creationComplete, etc. - nem sempre fogo), então se você quer ter certeza de seu renderizador é atualizado quando as alterações de itens de dados (como ele vai quando rolagem eventos acontecem), a melhor prática é substituir propriedade data do renderizador. Isso provavelmente vai resolver o problema.

Outras dicas

Talvez tentar invalidar em creationComplete?

Desde que me lembro com DataGrids (que funcionam um pouco semelhante a uma TileList), quando um item entra em foco a sua recriado.

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

Você não tentei este código, mas eu acho que isso é onde você quer começar a procurar. Dei uma olhada no seu componente itemRenderer. Tente creationComplete em vez de inicialização para chamar sua função

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top