Dúvidas Atualizar Dados no ListView

Boa tarde.

Estou carregando um ListView com dados cadastrados em outra Activity, mas sempre o último item que eu inclui é o que aparece. Eu verifiquei bastante nos foruns, pesquisei bastante e não achei situações semelhantes, se alguém puder me ajudar eu agradeceria.

Na Activity de PedidoItens eu gero o objeto e adiciono a uma lista que passo para a activity de Pedidos, quando clico no botão salvar:

[code]ArrayList list = new ArrayList();
PedidoItem objPedItem = new PedidoItem();
objPedItem.set_PedidoRef(1);
objPedItem.set_Item(item.getText().toString());
objPedItem.set_Produto(produto.getText().toString());
objPedItem.set_Qtde(Float.parseFloat(quantidade.getText().toString()));
objPedItem.set_ValorUnitario(Float.parseFloat(valorunitario.getText().toString()));
objPedItem.set_Total(Float.parseFloat(total.getText().toString()));
list.add(objPedItem);

	Intent troca = new Intent(CadastroPedidoItem.this, CadastroPedido.class);
	troca.putParcelableArrayListExtra("listaItem", list);
	setResult(RESULT_OK, troca);
	CadastroPedidoItem.this.finish();[/code]

Eu recebo essa lista na minha Activity de Pedido:

ArrayList<PedidoItem> result; result = data.getParcelableArrayListExtra("listaItem"); ListView listItem = (ListView) findViewById(R.id.listItens); PedidoItemAdapter adapter = new PedidoItemAdapter(this, result); listItem.setAdapter(adapter);

E tenho minha classe que extende o BaseAdapter, para não ficar muito código vou colocar apenas o GetView:

[code]public View getView(int position, View convertView, ViewGroup parent) {

		View v;
		
		PedidoItem pedItem = pedItens.get(position);
		LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		v = inflater.inflate(R.layout.listaitens, null);
    
		TextView item = (TextView) v.findViewById(R.id.txtItens);
		item.setText(pedItem.get_Item() + " - " + pedItem.get_Produto());
			
		return v;
	}[/code]

Só que eu insiro um item, ele aparece na ListView de Pedidos e tudo mais, quando eu vou inserir um novo item e gravo, ele deixa apenas esse último item na ListView.
Como eu faria para ir atualizando a ListView neste caso e incluindo vários itens. Eu vi bastante sobre o NotifyDataSetChanged, mas não consegui utilizá-lo na minha app. Por isso recorri a perguntar aqui.

Um detalhe é que minha classe de atributos PedidoItem está implementando parcelable, não sei se tem influência.

Obrigado desde já.

Creio que aparecerá sempre o ultimo registro inserido porque vc está iniciando seu ListView na hora de receber o resultado.
Vc pode inicializar seu ListView no método onCreate da Activity e popular apenas a lista que será passada para o Adapter.
Feito isso, vc chama o método notifyDataSetChanged do adapter, para atualizar a sua lista.

Entendi, mas dessa maneira então.

Eu iniciei o ListView no OnCreate.

listItem = (ListView) findViewById(R.id.listItens);

E cada vez que recebo o resultado eu mudei desta maneira.

if (resultCode == RESULT_OK){ ArrayList<PedidoItem> result; result = data.getParcelableArrayListExtra("listaItem"); PedidoItemAdapter adapter = new PedidoItemAdapter(this, result); listItem.setAdapter(adapter); adapter.notifyDataSetChanged(); }

O que estou fazendo de errado, ainda não atualizou.

[quote=m_araujo01]Creio que aparecerá sempre o ultimo registro inserido porque vc está iniciando seu ListView na hora de receber o resultado.
Vc pode inicializar seu ListView no método onCreate da Activity e popular apenas a lista que será passada para o Adapter.
Feito isso, vc chama o método notifyDataSetChanged do adapter, para atualizar a sua lista.[/quote]

Você está fazendo a sua lista receber somente um resultado, pelo que vejo, e instanciando o Adapter novamente, sendo assim, os outros registros irão se perder…
O que vc pode fazer é declarar o adapter como uma variável global, atualizar a sua lista de modo que ela não perca os dados, e chamar o notifyDataSetChanged…
Lembrando que não precisa setar o adapter novamente no seu ListView, vc pode fazer isso no método onCreate.

Bom dia.

Desculpe minha ignorância, eu dei uma analisada e mudei algumas coisas no meu código, declarei a lista como global para receber os itens. Também declarei um adapter do tipo da minha classe que extende o BaseAdapter. Mas acredito eu que meu problema está no construtor da minha BaseAdapter, eu fiz dessa maneira:

public PedidoItemAdapter(Context contexto, List<PedidoItem> pedItem) { pedItens = pedItem; context = contexto; }

Ele é carregado quando eu seto o adapter, ou seja eu sempre passo o novo item e ele sobrepõem a lista. Eu teria de modificar o construtor e preservar o conteúdo da lista antes de adicionar o novo item.

Outro ponto é que declarando o listView e o adapter como global e não setando após recebe o resultado, ele não recebe os dados e não infla o ListView. Pode ser que também resolvendo o construtor resolva esta minha dúvida.

Obrigado desde já.

[quote=m_araujo01]Você está fazendo a sua lista receber somente um resultado, pelo que vejo, e instanciando o Adapter novamente, sendo assim, os outros registros irão se perder…
O que vc pode fazer é declarar o adapter como uma variável global, atualizar a sua lista de modo que ela não perca os dados, e chamar o notifyDataSetChanged…
Lembrando que não precisa setar o adapter novamente no seu ListView, vc pode fazer isso no método onCreate.[/quote]

Então, pelo que vi no seu código, vc faz a sua lista receber novamente os dados, de modo que irá substituir os objetos existentes na lista por um novo objeto…
o que eu aconselharia é vc tentar passar o objeto e adicioná-lo em uma lista na Activity, aí chama o método para atualizar o Adapter… eu tenho um exemplo que é parecido, uso ele para excluir itens da lista, onde excluo do meu ArrayList, e chamo o método notifyDataSetChanged para atualizar o ListView… funciona perfeitamente, e no seu caso, pode funcionar tbm… estou no trabalho agora, mas quando puder, posto um exemplo pra vc analisar…

Quando ao construtor do seu Adapter, creio que está certo, pois é a estrutura que eu uso em meus projetos tbm…

Então eu consegui resolver seguindo o que você disse, obrigado pela ajuda.

Mas se quiser postar o exemplo para caso alguém tenha a mesma dúvida e quiser tirar a dúvida ai já fica por aqui, vou postar a maneira como consegui também:

Declarei meu adapter e minha lista:

[code]List pedItens = new ArrayList();

PedidoItemAdapter adapter;[/code]

No onCreate eu defino minha lista, chamo o construtor do adapter, seto o adapter:

listItem = (ListView) findViewById(R.id.listItens); adapter = new PedidoItemAdapter(this, pedItens); listItem.setAdapter(adapter);

No onActivityResult eu recebo o resultado, adiciono para a lista e seto novamente.

ArrayList<PedidoItem> result; result = data.getParcelableArrayListExtra("listaItem"); pedItens.addAll(result); adapter = new PedidoItemAdapter(this, pedItens); listItem.setAdapter(adapter);

E no construtor do BaseAdapter eu verifico:

           [code]public PedidoItemAdapter(Context contexto, List<PedidoItem> pedItem) {
		
		if(pedItem == null)
			this.pedItens = new ArrayList<PedidoItem>();
		else
		{
			this.pedItens = pedItem;
			this.context = contexto;
		}
	}[/code]

A parte do GetView não mudou nada. E também fiz a parte de exclusão dos itens da ListView.

Legal, que bom que conseguiu resolver…
Fica aí a dica pro pessoal que estiver com a mesma dúvida… grande abraço! :wink:

vlw pela ajuda ae
tbm tava precisando

gmribas, por favor, troque o seu avatar para uma imagem menor.
A imagem do mesmo está atrapalhando a visualização da página.

Obrigado!

senhor moderador, tentei trocar meu avatar e não consegui.

Ocorreram alguns erros e a atualização não aconteceu.

Expression w is undefined on line 39, column 78 in default/user_form.htm.

Tentei usar mas não deu certo, desde as declarações do adapter e da lista