[RESOLVIDO]Alteracao de componenets do arraylist

boa tarde, tenho uma duvida referente ao for que estou fazendo em um arraylist de objetos. Tenho um metodo for para alterar a minha lista que popula o rich:datatable, neste datatable existem duas colunas, uma de Justificativa e outra de Status, a alteracai da Justificativa funciona perfeitamente! mas a alteracao do Status não :cry:, segue o meu codigo para a alteracao:

Justificativa funciona perfeitamente:

public String alterarJustificativa() {

		System.out.println(getPegaid());

		for (JustificativaMB obj : listaJustificativa) {
			int posicao = listaJustificativa.indexOf(obj);

			if (posicao == getPegaid()) {
				JustificativaMB objAux = obj;
				obj.setDescricao("TEXTO MODIFICADO");
				obj.setStatus("Ativo");
				listaJustificativa.remove(objAux);
				listaJustificativa.add(posicao, obj);
				break;
			}

		}

		return null;
	}

e a alteracao do Status não:

[code]public String alterarStatus() {
System.out.println(getPegaid());

	for (JustificativaMB obj : listaJustificativa) {
		int posicao = listaJustificativa.indexOf(obj);

		if (posicao == getPegaid()) {
			JustificativaMB objAux = obj;
			if (obj.getStatus().equals("Ativo")) {
				obj.setStatus("Ativo");

			} else {
				obj.setStatus("Inativo");
			}
			listaJustificativa.remove(objAux);
			listaJustificativa.add(posicao, obj);
			break;
		}

	}
	return null;
}[/code]

Que complicado. Só uma perguntinha idiota. Eu queria saber se getPegaid() retorna o mesmo valor a cada vez que é chamada dentro do loop, ou se ficar retornando valores diferentes. Se retorna o mesmo valor a cada vez que é chamada dentro do loop, eu trocaria seu código:

         for (JustificativaMB obj : listaJustificativa) {  
             int posicao = listaJustificativa.indexOf(obj);  
   
             if (posicao == getPegaid()) {  
                 JustificativaMB objAux = obj;  
                 obj.setDescricao("TEXTO MODIFICADO");  
                 obj.setStatus("Ativo");  
                 listaJustificativa.remove(objAux);  
                 listaJustificativa.add(posicao, obj);  
                 break;  
             }  
   
         }  

por este aqui:

int posicaoAModificar = getPegaid();
if (0 <= posicaoAModificar && posicaoAModificar < listaJustificativa.size()) {
    JustificativaMB just = listaJustificativa.get(posicaoAModificar);
    just.setDescricao ("TEXTO MODIFICADO");
    just.setStatus ("Ativo");
}

Viu? Muito mais rápido (porque não precisa de loop) e muito mais claro.
Em particular, o uso de indexOf que você fez no seu código é terrível, porque envolve uma busca linear, onde o método “equals” está sendo chamado para cada elemento da lista, o que é simplesmente muito lento se a lista for grande.

[quote=entanglement]Que complicado. Só uma perguntinha idiota. Eu queria saber se getPegaid() retorna o mesmo valor a cada vez que é chamada dentro do loop, ou se ficar retornando valores diferentes. Se retorna o mesmo valor a cada vez que é chamada dentro do loop, eu trocaria seu código:

         for (JustificativaMB obj : listaJustificativa) {  
             int posicao = listaJustificativa.indexOf(obj);  
   
             if (posicao == getPegaid()) {  
                 JustificativaMB objAux = obj;  
                 obj.setDescricao("TEXTO MODIFICADO");  
                 obj.setStatus("Ativo");  
                 listaJustificativa.remove(objAux);  
                 listaJustificativa.add(posicao, obj);  
                 break;  
             }  
   
         }  

por este aqui:

int posicaoAModificar = getPegaid();
if (0 <= posicaoAModificar && posicaoAModificar < listaJustificativa.size()) {
    JustificativaMB just = listaJustificativa.get(posicaoAModificar);
    just.setDescricao ("TEXTO MODIFICADO");
    just.setStatus ("Ativo");
}

Viu? Muito mais rápido (porque não precisa de loop) e muito mais claro.
Em particular, o uso de indexOf que você fez no seu código é terrível, porque envolve uma busca linear, onde o método “equals” está sendo chamado para cada elemento da lista, o que é simplesmente muito lento se a lista for grande.
[/quote]
Realmente assim funciona mas, o status não é alterado:

[code]public String alterarStatus() {
int posicaoAModificar = getPegaid();
if (0 <= posicaoAModificar
&& posicaoAModificar < listaJustificativa.size()) {
JustificativaMB just = listaJustificativa.get(posicaoAModificar);
if (listaJustificativa.get(posicaoAModificar).status
.equals(“Ativo”)) {
just.setStatus(“Inativo”);

		} else {
			just.setStatus("Ativo");
		}

	}
	return null;
}[/code]

Não testei aqui, mas:

    public String alterarStatus() {  
            int posicaoAModificar = getPegaid();  
            if (0 <= posicaoAModificar  
                    && posicaoAModificar < listaJustificativa.size()) {  
                JustificativaMB just = listaJustificativa.get(posicaoAModificar);  
                if (just.status.equals("Ativo")) {  
                    just.setStatus("Inativo");  
      
                } else {  
                    just.setStatus("Ativo");  
                }  
                listaJustificativa.set(posicaoAModificar, just);
      
            }  
            return null;  
        }  

Por que você possui um método que retorna uma String se no final ele vai retornar null?

Tem cara de que seu método setStatus está bugado :frowning:

FINALMENTE consegui falto colocar o “reRender” no botao !

Pra finalizar esqueci uma coisa, a alteracao da justificativ aeu coloquei fixo, mas na verdade essa alteracao vem de um cam po de texto, mas não funciona :

just.setDescricao(getTxtAlterar());//nao retorna nada 

Esse campo de texto esta em um modalpanel interfere em alguma coisa ?