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