Atualizar fragment sem ter que girar a tela

556 views
Skip to first unread message

delki8

unread,
Oct 24, 2012, 7:58:34 PM10/24/12
to androidb...@googlegroups.com
Pessoal meu app faz o download de alguns itens, joga isso num banco de dados e depois faz a leitura desses itens no banco para popular um ListView dentro de um fragment.

Na minha action bar eu tenho um botão que faz o download/cadastra no banco. O meu problema é que eu quero que esse botão também dê um jeito de atualizar a lista de itens que estão no banco. Atualmente o fragment só mostra os itens recém cadastrados quando eu giro o celular colocando ele no modo paisagem, obrigando toda a activity a ser reconstruída.

Dúvida:
Como eu dou um refresh no fragment depois que os novos dados são inseridos no banco?
O link para a classe é esse aqui: http://pastebin.com/xDgkM0ay

Agradeço muito a atenção de vocês. Se alguém tiver alguma sugestão de solução eu ficaria muito agradecido :)

Otávio Mendes

unread,
Oct 25, 2012, 7:08:34 AM10/25/12
to androidb...@googlegroups.com
Depois que fizer o download e atualizar o banco de dados, você atualiza os dados do Adapter (atualizando o List dele por exemplo) da ListView e depois chama o método notifyDataSetChanged() do Adapter

--
 
 

delki8

unread,
Oct 25, 2012, 5:22:23 PM10/25/12
to androidb...@googlegroups.com
Otavio, obrigado pela resposta. Fiz de uma forma que eu acho que é a correta mas ele ainda não passou. A parte destacada é onde eu tento pegar a lista que veio do banco e atualizar ela na listview, fiz alguma besteira?

 refreshParcial.setOnMenuItemClickListener(new OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
new Thread(){
@Override
public void run() {
BoletimControl bControl = new BoletimControl();
bControl.atualizaBoletins(false, PublicacoesGUI.this);
BoletimRepositorio bRep = new BoletimRepositorio(PublicacoesGUI.this);
boletins = bRep.listarBoletins();
if (boletins != null) {
handler.post(new Runnable() {
@Override
public void run() {
adapter.setLista(boletins);
adapter.notifyDataSetChanged();
}
});
}
}
}.start();
return true;
}
});

Ouvi dizer que o Handler não estava mais sendo usado mas como no livro onde estudo ele ainda era a única forma de atualizar a activity de uma Thread externa, usei ele aqui também.


--
 
 



--

Buiu

unread,
Oct 26, 2012, 5:24:13 AM10/26/12
to androidb...@googlegroups.com
Cara te recomendaria a dar uma olhada e utilizar o AsyncTask

é claro utilizando Thread tbm funciona...

Cara, so vc esta apenas fazendo a consulta no banco não é necessário colocar dentro de uma Thread... pode fazer isso direto.... "OnMenuItemClickListener() {"

Deixa apenas a parte do download dentro da Thread ou AsyncTask.




--
 
 





luciofm

unread,
Oct 26, 2012, 6:00:50 AM10/26/12
to androidb...@googlegroups.com
Via de regra, qualquer operação de I/O deve ser feita fora da thread
principal, e uma leitura do banco é I/O.

Para isso mesmo existe o CursorLoader:
This class implements the Loader protocol in a standard way for
querying cursors, building on AsyncTaskLoader to perform the cursor
query on a background thread so that it does not block the
application's UI.

Lúcio Maciel
luc...@gmail.com


2012/10/26 Buiu <buiuc...@gmail.com>:
> --
>
>

delki8

unread,
Oct 26, 2012, 4:37:02 PM10/26/12
to androidb...@googlegroups.com
Mas o AsyncTask (vou ler mais a respeito) apenas substitui a minha Thread correto? Talvez como uma melhor prática e tal. Mas agora eu gostaria realmente de apenas atualizar o conteúdo desse bendito fragment, parece algo tão simples mas ta me dando tanto olé xD.

Bom, se alguém tiver alguma ideia, eu ficarei muito feliz, vou continuar pesquisando aqui.

Buiu

unread,
Oct 26, 2012, 6:42:49 PM10/26/12
to androidb...@googlegroups.com
Opa!

manda mais informações do erro que esta ocorrendo... pois apenas com o trecho de código que disponibilizou não consegui identificar nada...

--
 
 




delki8

unread,
Oct 29, 2012, 6:34:29 PM10/29/12
to androidb...@googlegroups.com
Valeu Cristian, o problema é o seguinte: quando eu clico no botão para atualizar as informações do banco de dados eu quero que o fragment com a minha lista de componentes também seja atualizado.

Atualmente isso [atualizar a tela] só está acontecendo quando o aplicativo é aberto ou quando coloco o aparelho em modo paisagem (obrigando-o a recriar o fragment). O código da classe é este aqui, e o código que eu destaquei no email anterior é o onClick que adiciona as informações no banco e que eu acredito que será responsável por atualizar o fragment.

E claro né, se alguma coisa não estiver ficado clara eu tento me expressar melhor, valeu a atenção.

Otávio Mendes

unread,
Oct 29, 2012, 8:18:04 PM10/29/12
to androidb...@googlegroups.com
Faça como está feito nessas duas classes em anexo

ExemploActivity.java
ExemploAdapter.java

delki8

unread,
Dec 3, 2012, 5:58:20 PM12/3/12
to androidb...@googlegroups.com
Bom galera, me desculpem pela longa demora na resposta ou na minha manifestação em relação a ajuda que vocês me deram. O mês de Novembro foi muito puxado no trabalho e não deu tempo de mexer muito no aplicativo. Acontece que agora estou mais tranquilo e queria agradecer pela ajuda. Eu consegui descobrir e corrigir o problema.

O que estava acontecendo?
1- O problema é que primeiro eu chamava um método que realizava uma tarefa assíncrona, que era o de atualizar os dados do banco com informações do site.
2- Na sequência eu chamava o método de atualizar a lista da tela, que populava a lista com informações do banco.
3- No momento em que eu chamava o método para atualizar a lista, o método que altera as informações do banco ainda não tinha terminado a tarefa, por isso a tela aparentemente não atualizava. O que acontecia na verdade é que o método estava atualizando corretamente mas as informações no banco ainda eram as antigas.

Como eu resolvi?
Eu coloquei o método de atualizar a activity junto com o método que atualiza o banco, dessa forma um virá sempre imediatamente após o outro, mas sem atropelamentos, tudo certo.
Reply all
Reply to author
Forward
0 new messages