[RESOLVIDO]Alteracao de componenets do arraylist

6 respostas
rapha.java

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:

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;
	}

6 Respostas

E

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.

rapha.java
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.
Realmente assim funciona mas, o status não é alterado:
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;
	}
S

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?

E

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

rapha.java

FINALMENTE consegui falto colocar o “reRender” no botao !

rapha.java

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 ?

Criado 8 de setembro de 2011
Ultima resposta 8 de set. de 2011
Respostas 6
Participantes 3