ListView - Atualizar

Fala rapaziada,

Estou com um pequeno problema, não consigo entender o conceito para atualizar meu ListView. Já li e reli em vários sites inclusive aqui no guj e a coisa não entre na cabeça.

Bom, vamos lá:

Tenho uma tela que tem um EditText (Campo Qtde Vendida) e um ListView (Lista de Produtos). Na lista de produtos tenho os seguintes campos: código do produto, descrição do produto, preço e qtde vendida. Essa lista é alimenta pelo banco de dados através de um BaseAdapter.

Quando seleciono um produto, digito a quantidade vendida e meu EditText perde o focus, estou atualizando o banco e gostaria de atualizar a lista de produtos com a qtde digita e eu não estou conseguindo fazer isso.

Alguém tem alguma solução que possa me ajudar

Desde já obrigado a todos.
Leandrooooo

Modifique oos objetos na lista do seu adapter e lançe “notiyDataSetChaged()”

Marky, ta complicado nao sei como implementar esse metodo dentro do meu adapter e onde eu devo chamar ele dentro do getView?

Ta complicado!

Desculpe a ignorancia no assunto…eh q to apanhando mesmo.

Valew.

Quando você cria um base adapter é geralmente é passado uma lista de dados que será utilizada para preencher cada linha da listView.
Crie um método para pegar essa lista (adapter.getList()), adicione nela o que precisa e depois chame o adapter.notiyDataSetChaged()

Senhores, bom dia, continuo com problema, peço a ajuda novamente, não estou entendedo. Abaixo mu adapter.

public class ProdutosPedidoItemAdapter extends BaseAdapter{
	
	private List<SisPedidoItemC8> lista;
	@SuppressWarnings("unused")
	private Context ctx;
	LayoutInflater inflater;

	public ProdutosPedidoItemAdapter(Context ctx, List<SisPedidoItemC8> vo){
		this.lista = vo;
		this.ctx = ctx;
		inflater = LayoutInflater.from(ctx);
	}

	public int getCount() {
		return lista.size();
	}

	public Object getItem(int position) {
		return lista.get(position);
	}

	public long getItemId(int position) {
		return position;
	}
	
	@SuppressLint("ResourceAsColor")
	public View getView(int position, View v, ViewGroup parent) {

		ViewHolder holder;

		if (v == null){
			v = inflater.inflate(R.layout.adapter_pedprodutos_grid, null);
			holder = new ViewHolder();
			holder.produto      = (TextView)v.findViewById(R.id.appc_txv_codProd);
			holder.descricao    = (TextView)v.findViewById(R.id.appc_txv_descProd);
			holder.qtdVen       = (TextView)v.findViewById(R.id.appc_txv_qtdVenda);
			holder.qtdBon       = (TextView)v.findViewById(R.id.appc_txv_qtdBonif);
			holder.qtdDoa       = (TextView)v.findViewById(R.id.appc_txv_qtdDoacao);
			holder.vlrTab       = (TextView)v.findViewById(R.id.appc_txv_vlrTabela);
			holder.descEmb      = (TextView)v.findViewById(R.id.appc_txv_descEmb);
			holder.descOfe      = (TextView)v.findViewById(R.id.appc_txv_descOferta);
			holder.descVol      = (TextView)v.findViewById(R.id.appc_txv_descVol);
			holder.descPcteProm = (TextView)v.findViewById(R.id.appc_txv_desPcteProm);
			holder.perCom       = (TextView)v.findViewById(R.id.appc_txv_descCom);
			holder.vlrVen       = (TextView)v.findViewById(R.id.appc_txv_vlrVenda);
			holder.vlrTot       = (TextView)v.findViewById(R.id.appc_txv_vlrTotal);
			v.setTag(holder);
		}else{
			holder = (ViewHolder)v.getTag();
		}

		SisPedidoItemC8 pedItem = (SisPedidoItemC8) getItem(position);

		if (position % 2 == 0){
			v.setBackgroundResource(R.drawable.list_selector2);
		} else {
			v.setBackgroundResource(R.drawable.list_selector1);
		}
		
		String posição = String.valueOf(position);
		Log.e("POSIÇÃO", posição);
		
		holder.produto.setText(pedItem.getC8_produto());
		holder.descricao.setText(pedItem.getC8_descPro());
		holder.qtdVen.setText(Diversos.formatarValor(pedItem.getC8_qtdVend()));
		holder.qtdBon.setText(Diversos.formatarValor(pedItem.getC8_qtdBon()));
		holder.qtdDoa.setText(Diversos.formatarValor(pedItem.getC8_qtdDoacao()));
		holder.vlrTab.setText(Diversos.formatarValor(pedItem.getC8_vlrBru()));
		holder.descEmb.setText(Diversos.formatarValor(pedItem.getC8_descEmb()));
		holder.descOfe .setText(Diversos.formatarValor(pedItem.getC8_descOfe()));
		holder.descVol.setText(Diversos.formatarValor(pedItem.getC8_descVol()));
		holder.descPcteProm.setText(Diversos.formatarValor(pedItem.getC8_descProm()));
		holder.perCom.setText(Diversos.formatarValor(pedItem.getC8_perCom()));
		holder.vlrVen.setText(Diversos.formatarValor(pedItem.getC8_vlrLiq()));
		//acertar vlr bruto
		holder.vlrTot.setText(Diversos.formatarValor(pedItem.getC8_vlrBru()));
		
		return v;
	}	
	
	private static class ViewHolder{
		TextView produto, descricao, qtdVen, qtdBon, qtdDoa, vlrTab, descEmb, descOfe, descVol, descPcteProm, perCom, vlrVen, vlrTot;
	}

}

Obrigado.

Você pode adicionar esse método… quando receber um novo item você chama ele, vai adicionar na lista e atualizar a listview

public void addAndNotify(SisPedidoItemC8 item){ if(lista!=null && item != null){ lista.add(item); this.notifyDataSetChanged(); } }

Instancie o objeto que é seu BaseAdapter e passa como parâmetro no seu listView.

  produtosPedidoItemAdapter = new ProdutosPedidoItemAdapter(seuContexto, suaListaAtualizada);
  listView.setAdapter(produtosPedidoItemAdapter);

Valeio, neste caso vai ficar muito lento, pois, toda vez ele vai ter que carregar meu listview com a query executada no banco, se que estou certo e entendi o que quiz me dizer… e no meu AFV tenho liberado para venda tenho quase 900 itens.

Já o que o nosso colega disse fabriciov disse, eu ainda estou tentando implementar, estou com uma certa dificuldade, mais vamos ver no final o que vai dar.

Na verdade minha maior dificuldade é entender o conceito. To apanhando para dedel.

fabriciov, verifique se está correto a forma que estou chamando o método addAndNotify para atualizar meu ListView:

Abaixo o metodo addAndNotify;

public void addAndNotify(SisPedidoItemC8 item, int posicao){  
		if(lista!=null && item != null){  
			Log.e("passou", "Atualiza listview");
			lista.set(posicao, item);
			//lista.add(item);  
			this.notifyDataSetChanged();  
		}  
	} 

1° estou pegando a posição do item selecionado (variavel: _posicaoList)
2° estou setando os valores que eu quero que seja atualizado no meu vo;
3° Chamo o metodo do meu BaseAdapter passando os paramentros, abaixo a forma que estou chamando

new ProdutosPedidoItemAdapter(NovoPedidoItemActivity.this, daoProd.listaPedItems(Constantes.NUM_PED_GERADO)).addAndNotify(c8, _posicaoList);

Se isso estiver correto não sei o que acontece, pois, não esta atualizando meu ListView.

Obrigado

[code]ListView mListView = (ListView) findViewById(R.id.listView1);
ProdutosPedidoItemAdapter mAdapter = new ProdutosPedidoItemAdapter(Context, List);
mListView.setAdapter(adapter);

//Sua query no banco de dados provavelmente é feito em uma Thread diferente da Thread de UI para evitar ANR.
//Vamos imaginar que você recebe os dados das querys em tempo real e é enviada para Activity através de uma callback (onNewEntry)
//Assim que for lido um novo item no banco o metodo onNewEntry é chamado e por sua vez ela adiciona o item na List dentro do mAdapter
//e notifica o mesmo que os dados utilizados para preencher a listView Foram alterados, fazendo que seja atualizado.
public void onNewEntry(SisPedidoItemC8 item, int pos){
mAdapter.addAndNotify(item, post);
}

//Em suma, você precisa criar uma lista com um Adapter, mesmo que vazio e notifica-lo toda vez que seu conteúdo for alterado para que ele atualize as informações no ListView.
//Isso é muito útil para quando você vai carregar uma lista de imagens da internet e a leitura é sincrono, mostrando ao usuário uma lista vazia e de acordo que você carrega uma imagem adiciona ela ao adapter e notifica… atualizando em tempo real.
[/code]

leandro não vai executar novamente a query, você pode adicionar o objeto na sua lista.

fabriciov, eu nunca fiz assim. Mas gostei da sua sugestão, vou testar.

fabriciov, valeu cara… A principio deu certo, vou continuar os testes aqui e qualquer nova duvida vou postar para que possa me ajudar.

Obrigado a todos que postou, me ajudou e muito.

fabriciov, uma duvida sobre um comentario que fez, quando disse:

“Sua query no banco de dados provavelmente é feito em uma Thread diferente da Thread de UI para evitar ANR”

O ideal é que as querys seja feito por Thread? Eu não estou fazendo isso, pode me explicar melhor.

Valeu.

Ações bloqueantes como acesso ao banco, download ou qualquer outra que pode fazer a thread de UI (Main Thread do aplicativo) ficar sem responder podem gerar um ANR (nativo do android).
Para Resolver esse problema o certo é disparar uma nova Thread (ou AsyncTask) para executar esta função… caso ela não responda o aplicativo não vai travar, ai você pode fazer um tratamento de TimeOut caso não haja resposta depois de um certo tempo.

Só uma observação: ANR = Application Not Responding, após isso o usuario tem a opção forçar o encerramento do aplicativo.

Valew galera deu certo aqui, porem, estou com outra duvida;

No ListView quando carrego minha lista de produtos eu vou colorindo as descrições dos produtos de acordo com o status (Em Falta, Promoção, Lançamento e etc). Até Aqui tudo bem.

O problema esta quando faço a busca do status do produto, pois, meu DAO está dentro do getView e ele está sendo executado varias vezes deixando lento o focus no meu editText,
não estou conseguindo enxergar outra forma para resolver esse problema.

Alguém tem alguma dica?

Att
Leandrooooo