[RESOLVIDO] Flex - Mudar cor do label num item de itemRenderer

8 respostas
pgnt

Olás

Estou penando pra descobrir como mudar a cor do label de um ítem de um List (com seus itemRenderers) em tempo de execução.

Pra simplificar, quero por ex mudar a cor de um label num ítem da lista ao clicar num botão na aplicação (não renderizado, fora da lista).

Intuitivamente tentei sem sucesso (mas ajuda a pegar a idéia) o seguinte:

Achei muita coisa sobre mudar o itemRenderer da lista, mas não quero mudar tudo, somente um específico de um evento vindo de fora.

Obrigado!

8 Respostas

renzonuccitelli

Acho que vc vai ter que escrever seu próprio renderer para fazer isso. Além disso, tem uma propriedade, autodrawbackground que vc tem que setar para false para controlar seu item.

[]s

pgnt

Sobre escrever o próprio renderer, acho q vc está falando em fazer outro renderer estilizado e depois trocar por ele, certo?
Se for isso eu já fiz, usando “ClassFactory”, mas deu errado pois na hora que ele faz o update do renderer, mais de um item é afetado (depende do tamnho da lista acho, mas uns 2 ou 3 ítens foram afetados pelo estilo).
Valeu!

renzonuccitelli

Os items renderes são reutilizados pelo data grid. Quando vc mexe no scrool, ele pega um item que não vai mais aparecer e reutiliza. Isso já ocorreu comigo, quando meu item renderer era um checkBox. Eu selecionava um e alguns outros eram tb selecionados. No seu renderer seria bom vc setar a cor toda vez que o seu data muda. Sobrescreva o método set data de seu componente e execute a lógica dentro. Se vc colocar o código fica mais fácil de ajudar.

[]s

pgnt

Então renzonuccitelli, eu já fiz algo parecido (não é em dataGrid, é num List) mas não rolou, vou colocar pra vc conferir:

primeiro criei minha lista com o atributo status (usado na condição de mudar a cor do label)

public class minhaLista extends List{

		private var _status:String;

		public function minhaLista(){super();}
		
		public function get status():String {return _status;}
		public function set status(value:String):void {_status = value;}
		
	}
depois, no meu itemRenderer, coloquei o override pra ler o status e mudar a cor do label
override public function set data(value:Object):void {
				super.data = value;
				if (data.status == "APROVADO") 
					lblItem.setStyle("color",0x39DF17); // cor verde
		}

e, finalmente, na aplicação, o valor do status com um Bind pra uma variável ‘global’ (rootStatus), que pode ser alterada por qualquer evento (clique de qq botão por ex)

<myComp:minhaLista id="thumbList" itemRenderer=meultemRenderer"   status="{rootStatus}" >

nenhum erro é acusado na aplicação mas nada disso funcionou, o meuItemRenderer não entra estilizado e nem altera :frowning:

Alguma sugestão?
Valeu!

renzonuccitelli

Como eu disse, o ItemRenderer é reutilizado. O que vc está fazendo é setar o background quando aprovado. Está faltando voltar a cor original quando o status for diferente de aprovado. Experimenta colocar um else na sobreposição do set data e voltar a cor original.

[]s

pgnt

Pode crer, agora entendi o processo, vc matou, foi só mesmo colocar o “else” pra ele aplicar (resetar) o que não estiver com status.
Testei inclusive com o ClassFactory e rolou (no fundo deve ser a mesma coisa, ou estou enganado?).

Brigadão :smiley:
abs

renzonuccitelli

No fim das contas mesmo quando vc coloca a String o flex por traz dos panos passa a classe como argumento do ClassFactory. O que eu faço é implementar sempre a interface IFactory em meus itemRenderes para não ter que usar o ClassFactory. Mas entre String e ClassFactory, prefiro o segundo, pois se vc refatorar o nome da classe não vai ter problemas, como vai ter no primeiro caso.

E precisando de um curso, de uma olhada em www.nuccitec.com.br.

[]s

pgnt

blz, valeu!

Criado 5 de outubro de 2010
Ultima resposta 6 de out. de 2010
Respostas 8
Participantes 2