Existe "refresh" em um ListView?

1,500 views
Skip to first unread message

Felipe Aron

unread,
Aug 23, 2012, 12:58:07 PM8/23/12
to androidb...@googlegroups.com
Galera, numa ListView eu mostro produtos com a coluna quantidade. 

Ao clicar no registro, eu decremento essa quantidade e chamo novamente meu método listView.setAdaptater() porém nesse processo ela recarrega toda a lista e volta para o início (topo).

Existe uma forma de eu atualizar a ListView, sem precisar recarregar novamente pelo setAdapter(), e permanrcer no marcador selecionado?

--
Analista-Programador

Neto Marin

unread,
Aug 23, 2012, 1:01:47 PM8/23/12
to androidb...@googlegroups.com
Vc deve atualizar o conjunto de dados e chamar o metodo notifyDatasetChanged do adapter

Documentação
---
Neto Marin

Blog: http://blog.netomarin.com
GTalk: neto...@gmail.com
MSN: neto_...@hotmail.com
Skype: netomarin


2012/8/23 Felipe Aron <felip...@gmail.com>

Otávio Mendes

unread,
Aug 23, 2012, 1:04:02 PM8/23/12
to androidb...@googlegroups.com
Provavelmente você tem um List na sua classe Adapter que mantém os elementos que você monta o View que será exibido na lista.

Quando você decrementar esse valor, decremente também na lista e depois chame notifyDataSetChanged() do adapter.

Classe Adapter:
public void decrementa(int position) {
Object obj = lista.get(position);
obj.decrementa();
lista.set(position, obj);
}

Na Activity:
adapter.decrementa(position);
adapter.notifyDatasetChanged();

Felipe Aron

unread,
Aug 23, 2012, 1:25:11 PM8/23/12
to androidb...@googlegroups.com
Muitíssimo obrigado galera! Funcionou direitinho! :)

Felipe Aron

unread,
Aug 24, 2012, 8:33:24 AM8/24/12
to androidb...@googlegroups.com
Galera um novo último problema, hehe:

O método adapter.notifyDataSetChanged() atualiza corretamente o registro em questão.

Na tela de Itens tem o botão "Devolver", pode ao clicar decrementa a quantidade "vendida" até zero (0). Caso clique novamente em "devolver" já com a qtde. "vendida" = 0, é incluido um novo registro na lista do adapter.

Ao incluir esse novo registro e chamar o método notifyDataSetChange() ele não atualiza a lista para conter o novo registro. Somente se eu "recriar" o adapter ele irá mostrar.

E agora como resolver? To tentando aqui alternativas mas até agora sem sucesso.

Ivan Java

unread,
Aug 24, 2012, 9:00:27 AM8/24/12
to androidb...@googlegroups.com
Você esta incluindo esse objeto na sua lista dentro do adapter, como no exemplo abaixo?

public void addItem(SuaClasse suaClasse) {
suaLista.add(suaClasse);

Felipe Aron

unread,
Aug 24, 2012, 1:06:15 PM8/24/12
to androidb...@googlegroups.com
Sim Ivan, incluo um novo objeto na lista - list.add( objeto )

Após isso se chamar o método adapter.notifyDataSetChanged() - não mostra o novo registro. Somente se eu recriar o adapter. :(

E agora não entendi, pela lógica a notificação era para enxergar esse novo registro correto? Ou não?

Neto Marin

unread,
Aug 24, 2012, 1:12:22 PM8/24/12
to androidb...@googlegroups.com
Mas a chamada do add não é na lista, tem q ser no adapter.

Ou, eu costumo ter o ArrayList na minha classe, adiciono o item nesse ArrayList e no adapter eu crio um  método setData(ArrayList<type> dados), chamo esse método e depois chamo o notify...

[]s

---
Neto Marin

Blog: http://blog.netomarin.com
GTalk: neto...@gmail.com
MSN: neto_...@hotmail.com
Skype: netomarin


2012/8/24 Felipe Aron <felip...@gmail.com>

Felipe Aron

unread,
Aug 24, 2012, 1:38:16 PM8/24/12
to androidb...@googlegroups.com
Neto, não ficou muito claro essa questão.

Eu tenho uma classe Singleton que controla a lista de produtos vendidos/devolvidos. É a partir dela que eu faço a devolução de um item através de um método:

ItensDevolvidos.devolverItem(ItemDevolvido item);

Nesse método, caso já tenha devolvido tudo, é criado um novo item denominado "Item Anterior" identificado por uma propriedade no objeto.

Vi que no meu Adapter tem o método add(ItemDevolvido object) - no caso devo usar esse método para poder atualizar corretamente o adapter? 

Neto Marin

unread,
Aug 24, 2012, 1:44:45 PM8/24/12
to androidb...@googlegroups.com
Sim, o adapter sempre monta a lista baseado nos dados q ele tem. 
Tanto é q, vc disse q ele só "funciona" qnd vc recria o adapter, pois nesse momento passa o objeto atualizado pra ele.

Felipe Aron

unread,
Aug 24, 2012, 1:55:14 PM8/24/12
to androidb...@googlegroups.com
Entendi.

Você ainda passou outra opção de criar um método no adapter setData() passando a lista como parâmetro. 

No caso esse método ao receber a lista o que devo fazer "dentro" do adapter? Preciso referenciar a lista? Como?

Desculpa perguntar tanto, mas estou um pouco confuso ainda - marinheiro de primeira viagem...rs.

Neto Marin

unread,
Aug 24, 2012, 1:57:01 PM8/24/12
to androidb...@googlegroups.com
Vc não estende o adapter?
Faça o método lá, q recebe e atualiza a lista q ele já tem guardada.

Bernardo Ferreira e Souza

unread,
Aug 24, 2012, 1:57:17 PM8/24/12
to androidb...@googlegroups.com
no getView vc usa os elementos dessa lista que o adapter recebe..
Assim como nos outros métodos que tem que fazer override (o do count e talz)


A idéia aqui eh que quando o Android for recriar a view, ela tenha sido modificada de alguma forma.

Otávio Mendes

unread,
Aug 24, 2012, 1:58:45 PM8/24/12
to androidb...@googlegroups.com
Adapter:
private List<Obj> list;

public Adapter() {
list = list();
}

public void setData(List<Obl> newList) {
this.list = newList;
}

Activity (onde você acrescenta o novo item):
private void onDataChanged() {
List<Obj> newList = getNewList();
adapter.setData(newList);
adapter.notifyDataSetChanged();

Felipe Aron

unread,
Aug 24, 2012, 2:19:50 PM8/24/12
to androidb...@googlegroups.com
Galera, agora sim entendi a simplicidade da coisa.

No meu caso, tinha pego um ArrayAdapter já pronto no projeto - o que não me ajudou muito. Troquei para BaseAdapter, que é o que utilizo e fiz as devidas alterações conforme suas orientações, em especial o Neto e Otávio - valeu.

+1 que aprendi e vai pro pacote! rs

Felipe Aron

unread,
Aug 24, 2012, 2:49:09 PM8/24/12
to androidb...@googlegroups.com
Galera ÚLTIMA coisa pra ficar o estado da arte, rs:

Ao selecionar um registro ele fica com uma cor em destaque. Ao clicar no botão Devolver/Vender ele agora faz a ação atualiza o adapter, o ponteiro continua no registro porém a cor de seleção some.

Como fazer para manter a cor de seleção no registro?

Estou enviando em anexo o print da tela com e sem a seleção pra ter ideia do problema.
tela-01.png
tela-02.png

Otávio Mendes

unread,
Aug 24, 2012, 2:57:15 PM8/24/12
to androidb...@googlegroups.com
Quando você executar a ação que seleciona, guarde a posição do elemento da lista selecionado. Depois da atualização você manda selecionar ele de novo:

private void seiLa() {
...
int position = listView.getSelectedIntemPosition();
...
adapter.nofityDataSetChanged();
listView.setSelection(position);
}

acho que isso deve funcionar, não testei


<tela-01.png><tela-02.png>

Reply all
Reply to author
Forward
0 new messages