Duvida em ArrayList: só aparece o último elemento na lista!
7 respostas
S
shamanpyro
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 beansList<ProfileBean>facebookfriends=newArrayList<ProfileBean>();ProfileBeanfacebookfriend=newProfileBean();
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
// 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.
}
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")@SessionScopedpublicclassCarrinhoBeanimplementsSerializable{privatestaticfinallongserialVersionUID=7810729837634865242L;privateStringnomeItem;privateintquantidadeItem;publicStringcar;// getts e settersprivateList<CarrinhoBean>lista=newArrayList<CarrinhoBean>();publicList<CarrinhoBean>listar(){returnthis.lista;}publicStringinsere(){lista.add(this);System.out.println(lista.toString());returnnull;}publicStringremove(){lista.remove(this);returnnull;}publicList<CarrinhoBean>getLista(){for(inti=0;i<lista.size();i++){if(this.lista==null||this.lista.isEmpty()){CarrinhoBeancarrinhoBean=newCarrinhoBean();this.lista=carrinhoBean.listar();}}returnthis.lista;}publicvoidsetLista(List<CarrinhoBean>lista){this.lista=lista;}}
Pagina jsf:
NovaRequisição
</ui:define><ui:definename="corpo"><h:formid="cadastro"><h:messages/><br/><fieldset><legend>Requisição</legend><h:panelGridcolumns="3"><h:outputTextvalue="Item:"/><h:selectOneMenuid="selecioneitem"value ="#{carrinhoBean.nomeItem}"><f:selectItemitemLabel="Selecione"itemValue=""/><f:selectItemsvalue="#{itemBean.itens}"var ="itens"itemValue="#{itens}"itemLabel="#{itens}"/></h:selectOneMenu><br/><h:outputLabelvalue="Quantidade:"for="quantidadeItem"/><h:inputTextid="quantidadeItem"label="Quantidade"value="#{carrinhoBean.quantidadeItem}"required="true"size="4"/><br/><h:commandButtonaction="#{carrinhoBean.insere}"value="Adicionar"/></h:panelGrid></fieldset><br/><br/><fieldset><legend>MeusItens</legend><h:panelGridcolumns="3"><h:dataTablevalue="#{carrinhoBean.lista}"var="car"rules="rows"cellpadding="5"><f:facetname="caption"><br/></f:facet><f:facetname="header">Iníciodalistagem</f:facet><f:facetname="footer">Finaldalistagem</f:facet><h:column><f:facetname="header">NomedoItem</f:facet><h:outputTextvalue="#{car.nomeItem}"/></h:column><h:column><f:facetname="header">Qntd.Solicitada</f:facet><h:outputTextvalue="#{car.quantidadeItem}"/></h:column><h:column><h:commandLinkaction="#{carrinhoBean.remove}"onclick="if (!confirm('Confirma a exclusão ?')) return false;"><h:graphicImagelibrary="imagens"name="apagar.png"style="border:0"/></h:commandLink></h:column></h:dataTable></h:panelGrid></fieldset><br/><br/><h:commandButtonvalue="Finalizar"/><br/><br/></h:form></ui:define></ui:composition></html>
L
lh.proenca
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")@SessionScopedpublicclassCarrinhoBeanimplementsSerializable{privatestaticfinallongserialVersionUID=7810729837634865242L;privateStringnomeItem;privateintquantidadeItem;publicStringcar;// getts e settersprivateList<CarrinhoBean>lista=newArrayList<CarrinhoBean>();publicList<CarrinhoBean>listar(){returnthis.lista;}publicStringinsere(){lista.add(this);System.out.println(lista.toString());returnnull;}publicStringremove(){lista.remove(this);returnnull;}publicList<CarrinhoBean>getLista(){for(inti=0;i<lista.size();i++){if(this.lista==null||this.lista.isEmpty()){CarrinhoBeancarrinhoBean=newCarrinhoBean();this.lista=carrinhoBean.listar();}}returnthis.lista;}publicvoidsetLista(List<CarrinhoBean>lista){this.lista=lista;}}
Pagina jsf:
NovaRequisição
</ui:define><ui:definename="corpo"><h:formid="cadastro"><h:messages/><br/><fieldset><legend>Requisição</legend><h:panelGridcolumns="3"><h:outputTextvalue="Item:"/><h:selectOneMenuid="selecioneitem"value ="#{carrinhoBean.nomeItem}"><f:selectItemitemLabel="Selecione"itemValue=""/><f:selectItemsvalue="#{itemBean.itens}"var ="itens"itemValue="#{itens}"itemLabel="#{itens}"/></h:selectOneMenu><br/><h:outputLabelvalue="Quantidade:"for="quantidadeItem"/><h:inputTextid="quantidadeItem"label="Quantidade"value="#{carrinhoBean.quantidadeItem}"required="true"size="4"/><br/><h:commandButtonaction="#{carrinhoBean.insere}"value="Adicionar"/></h:panelGrid></fieldset><br/><br/><fieldset><legend>MeusItens</legend><h:panelGridcolumns="3"><h:dataTablevalue="#{carrinhoBean.lista}"var="car"rules="rows"cellpadding="5"><f:facetname="caption"><br/></f:facet><f:facetname="header">Iníciodalistagem</f:facet><f:facetname="footer">Finaldalistagem</f:facet><h:column><f:facetname="header">NomedoItem</f:facet><h:outputTextvalue="#{car.nomeItem}"/></h:column><h:column><f:facetname="header">Qntd.Solicitada</f:facet><h:outputTextvalue="#{car.quantidadeItem}"/></h:column><h:column><h:commandLinkaction="#{carrinhoBean.remove}"onclick="if (!confirm('Confirma a exclusão ?')) return false;"><h:graphicImagelibrary="imagens"name="apagar.png"style="border:0"/></h:commandLink></h:column></h:dataTable></h:panelGrid></fieldset><br/><br/><h:commandButtonvalue="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.