ListView - Atualizar

15 respostas
L

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

15 Respostas

Marky.Vasconcelos

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

L

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.

fabriciov

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()

L

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.

fabriciov

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

V

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

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

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

fabriciov
ListView mListView = (ListView) findViewById(R.id.listView1);
ProdutosPedidoItemAdapter mAdapter = new ProdutosPedidoItemAdapter(Context, List<E>);
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<SisPedidoItemC8> 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.
V

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

V

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

L

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.

L

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.

fabriciov

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.

Marky.Vasconcelos

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

L

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

Criado 13 de junho de 2013
Ultima resposta 24 de jun. de 2013
Respostas 15
Participantes 4