Duvida em ArrayList: só aparece o último elemento na lista!

7 respostas
S

Boa noite geral =). Eu tava aqui fazendo um projeto e me deparei com uma situação estranha pra caramba. Deve ser o sono, mas não consigo de jeito nenhum descobrir o que está acontecendo.
Vamos lá:

//aqui eu declaro o meu bean  e uma lista de beans

List<ProfileBean> facebookfriends = new ArrayList<ProfileBean>();

ProfileBean facebookfriend = new ProfileBean();

for(int i=0;i < namigos;i++){ // eu tenho uma variável com o número de amigos do cara. Não é tão importante, imaginem um número qualquer… 100 por exemplo

facebookfriend.setFacebook("teste"+i);
facebookfriends.add(facebookfriend);

// out.print("
"+facebookfriend.getFacebook()
); //se eu descomento essa linha, no jsp imprime todos os elementos. Veja que eu usei o getFacebook, então
// eu consegui acessar o objeto que foi gravado através do setFacebook. Até aqui beleza.
}

for(ProfileBean abc : facebookfriends){// o problema aparece aqui. Quando eu percorro o array que acabei de preencher lá em cima, ele mostra repetidas vezes

//o último elemento gravado, sendo n vezes = o número de elementos lá dentro. No meu teste fica teste426 escrito 426 vezes! Deveria ficar teste1 teste2 teste3out.print(abc.getFacebook()+"
");

}

Ah, já ia me esquecendo. Muito obrigado =)!

7 Respostas

romarcio

Quando postar código, use as tags code, fica mais fácil de ler o código.

Tenta assim:

List&lt;ProfileBean&gt; facebookfriends = new ArrayList&lt;ProfileBean&gt;(); 
ProfileBean facebookfriend; 

for(int i=0;i &lt; namigos;i++){ 
    //inicializa aqui o objeto ProfileBean(), assim a cada loop do for, vc tem um novo objeto para inserir na lista e não sempre o mesmo como acontecia antes.
    facebookfriend = new ProfileBean();
    facebookfriend.setFacebook("teste"+i); 
    facebookfriends.add(facebookfriend); 
} 

for(ProfileBean abc : facebookfriends){
    out.print(abc.getFacebook()+" "); 
}
S

mais informações:

eu testei o conteúdo do list direto e deu n vezes o último elemento…

<code>

for(int i=0;i < namigos;i++){

out.print(facebookfriends.get(i).getFacebook());

}

</code>

teste426 teste426 teste426 (…)

valeu o toque da tag =)! Vou tentar, perai

S

valeu! deu certo =).

romarcio
shamanpyro:
valeu! deu certo =).

Ok!

Sobre a tag, tem um botão Code no acima do editor de texto, clica nela pra abrir e depois para fechar a tag. não é assim: <code> e sim assim: [code]

tiago_

Estou com o mesmo problema… Eu add um elemento 3 elementos no array, mas ele so aparece o ultmimo elemento q eu add (3x) pq eu adicionei 3 elementos.

@ManagedBean(name="carrinhoBean")
@SessionScoped

public class CarrinhoBean implements Serializable{
	
	private static final long serialVersionUID = 7810729837634865242L;
	
	private String nomeItem;
	private int quantidadeItem;
	public String car;
	
	// getts e setters

	private List<CarrinhoBean> lista = new ArrayList<CarrinhoBean>();  
    
    public List<CarrinhoBean> listar() {  
        return this.lista;  
    }  
      
    public String insere() {  
        lista.add(this);  
      
       
        System.out.println(lista.toString());
        return null;  
    }  
    
    public String remove() {  
        lista.remove(this);  
        return null;  
    }

	public List<CarrinhoBean> getLista() {
		
		for(int i = 0; i < lista.size(); i++){  
		 if (this.lista == null || this.lista.isEmpty()) {  
	            CarrinhoBean carrinhoBean = new CarrinhoBean();  
	            this.lista = carrinhoBean.listar();  
	        }  
		}
	        return this.lista;  
	
	}

	public void setLista(List<CarrinhoBean> lista) {
		this.lista = lista;
	}  

}

Pagina jsf:

Nova Requisição
</ui:define>
	<ui:define name="corpo">
		<h:form id="cadastro">
			<h:messages />
			<br/>
				<fieldset><legend>Requisição</legend>
				<h:panelGrid columns="3">
				<h:outputText value="Item:"/>  
        		<h:selectOneMenu id="selecioneitem" value ="#{carrinhoBean.nomeItem}">
 				<f:selectItem itemLabel="Selecione" itemValue=""/>  
 				<f:selectItems 
 					value="#{itemBean.itens}"
 					var ="itens"
					itemValue="#{itens}"
					itemLabel="#{itens}"/>
				</h:selectOneMenu>	
				<br/>
				<h:outputLabel value="Quantidade:" for="quantidadeItem" />
				<h:inputText id="quantidadeItem" label="Quantidade"
					value="#{carrinhoBean.quantidadeItem}" required="true" size="4"/>
				<br/>	
				<h:commandButton action="#{carrinhoBean.insere}"  value="Adicionar" />
				</h:panelGrid>
				</fieldset>	
				<br/>
				<br/>
				<fieldset><legend>Meus Itens</legend>
				<h:panelGrid columns="3">
				<h:dataTable value="#{carrinhoBean.lista}" var="car" rules="rows" 
				cellpadding="5">  
                <f:facet name="caption">  
                    <br />  
                </f:facet>  
                <f:facet name="header">Início da listagem</f:facet>  
                <f:facet name="footer">Final da listagem</f:facet> 
               <h:column>
                    <f:facet name="header">Nome do Item</f:facet>  
                  <h:outputText value="#{car.nomeItem}" /> 
                </h:column>  
                <h:column>  
                    <f:facet name="header">Qntd. Solicitada</f:facet>  
                   <h:outputText value="#{car.quantidadeItem}" /> 
                </h:column>  
                <h:column>
               <h:commandLink action= "#{carrinhoBean.remove}"
				 onclick="if (!confirm('Confirma a exclusão  ?')) return false;">
					<h:graphicImage library="imagens" name="apagar.png" style="border:0" />
				</h:commandLink>
                </h:column>
            </h:dataTable> 
            </h:panelGrid>
            </fieldset>
             <br/>
             <br/>
             <h:commandButton  value="Finalizar" /> 
             <br/>
             <br/>
        </h:form>  
    </ui:define>  
</ui:composition>  
</html>
L

Pessoal, estava com o mesmo problema e quebrando a cabeça desde sexta-feira, e resolveu com a solução do romarcio

regis_hideki

tiago__:
Estou com o mesmo problema… Eu add um elemento 3 elementos no array, mas ele so aparece o ultmimo elemento q eu add (3x) pq eu adicionei 3 elementos.

@ManagedBean(name="carrinhoBean")
@SessionScoped

public class CarrinhoBean implements Serializable{
	
	private static final long serialVersionUID = 7810729837634865242L;
	
	private String nomeItem;
	private int quantidadeItem;
	public String car;
	
	// getts e setters

	private List<CarrinhoBean> lista = new ArrayList<CarrinhoBean>();  
    
    public List<CarrinhoBean> listar() {  
        return this.lista;  
    }  
      
    public String insere() {  
        lista.add(this);  
      
       
        System.out.println(lista.toString());
        return null;  
    }  
    
    public String remove() {  
        lista.remove(this);  
        return null;  
    }

	public List<CarrinhoBean> getLista() {
		
		for(int i = 0; i < lista.size(); i++){  
		 if (this.lista == null || this.lista.isEmpty()) {  
	            CarrinhoBean carrinhoBean = new CarrinhoBean();  
	            this.lista = carrinhoBean.listar();  
	        }  
		}
	        return this.lista;  
	
	}

	public void setLista(List<CarrinhoBean> lista) {
		this.lista = lista;
	}  

}

Pagina jsf:

Nova Requisição
</ui:define>
	<ui:define name="corpo">
		<h:form id="cadastro">
			<h:messages />
			<br/>
				<fieldset><legend>Requisição</legend>
				<h:panelGrid columns="3">
				<h:outputText value="Item:"/>  
        		<h:selectOneMenu id="selecioneitem" value ="#{carrinhoBean.nomeItem}">
 				<f:selectItem itemLabel="Selecione" itemValue=""/>  
 				<f:selectItems 
 					value="#{itemBean.itens}"
 					var ="itens"
					itemValue="#{itens}"
					itemLabel="#{itens}"/>
				</h:selectOneMenu>	
				<br/>
				<h:outputLabel value="Quantidade:" for="quantidadeItem" />
				<h:inputText id="quantidadeItem" label="Quantidade"
					value="#{carrinhoBean.quantidadeItem}" required="true" size="4"/>
				<br/>	
				<h:commandButton action="#{carrinhoBean.insere}"  value="Adicionar" />
				</h:panelGrid>
				</fieldset>	
				<br/>
				<br/>
				<fieldset><legend>Meus Itens</legend>
				<h:panelGrid columns="3">
				<h:dataTable value="#{carrinhoBean.lista}" var="car" rules="rows" 
				cellpadding="5">  
                <f:facet name="caption">  
                    <br />  
                </f:facet>  
                <f:facet name="header">Início da listagem</f:facet>  
                <f:facet name="footer">Final da listagem</f:facet> 
               <h:column>
                    <f:facet name="header">Nome do Item</f:facet>  
                  <h:outputText value="#{car.nomeItem}" /> 
                </h:column>  
                <h:column>  
                    <f:facet name="header">Qntd. Solicitada</f:facet>  
                   <h:outputText value="#{car.quantidadeItem}" /> 
                </h:column>  
                <h:column>
               <h:commandLink action= "#{carrinhoBean.remove}"
				 onclick="if (!confirm('Confirma a exclusão  ?')) return false;">
					<h:graphicImage library="imagens" name="apagar.png" style="border:0" />
				</h:commandLink>
                </h:column>
            </h:dataTable> 
            </h:panelGrid>
            </fieldset>
             <br/>
             <br/>
             <h:commandButton  value="Finalizar" /> 
             <br/>
             <br/>
        </h:form>  
    </ui:define>  
</ui:composition>  
</html>

Isso acontece porque você sempre adiciona a mesma referência na lista. Há várias maneiras de consertar isso. A mais rápida, porém porca, é criar um novo objeto ao adicioná-lo ao carrinho, ao invés de passar “this”.

Uma alternativa melhor, seria ter uma classe Item com escopo menor do que “session”, como “request”, por exemplo. Então, a cada requisição seria criado um novo objeto.

Criado 4 de agosto de 2012
Ultima resposta 8 de abr. de 2014
Respostas 7
Participantes 5