Você deve executá-lo no thread da interface do usuário. Criar um manipulador de dentro do segmento interface do usuário e, em seguida, postar Runable a ele
Kirill Kulakov
11
Mais uma vez: notifyDataSetChanged () não funciona, pelo menos, para práticas de uso recomendadas (leitura não obsoleta). Se usar listview, adaptador de cursor e provedor de conteúdo, você pode tentar algo como: gettLoaderManager (). RestartLoader (). Consulte: stackoverflow.com/a/19657500/1087411 Gostaria de ver pelo menos alguma documentação em notifyDataSetChanged (). Muita coisa no android é deixada para testes em caixa preta.
Anderson
Se notifyDataSetChanged não funcionar, você é o único que está fazendo errado
zdarsky.peter
4
notifyDataSetChanged nem sempre funciona. Não sei por que isso está em disputa. Às vezes, é necessário chamar listView.setAdapter (adaptador) para limpar as exibições antigas. Veja também: stackoverflow.com/a/16261588/153275
1
Eu nunca consegui obter o notifyDataSetChanged funcionando. Pude ver claramente que a coleção que alimento no adaptador foi alterada (os elementos foram removidos), mas o notifyDataSetChanged nunca fez nada. Não tem certeza se este método está quebrado?
Esta é a resposta correta se for necessário redesenhar a exibição. Por exemplo, depois que um login de usuário ocorre, é necessário expor mais informações ou opções em cada exibição do listView. Era o que eu precisava fazer, então fiz uma votação. Se os dados subjacentes mudarem, provavelmente é uma idéia melhor usar o notifyDataSetChanged ().
SBerg413 6/06/2013
Na verdade, invalidateViews()nos conjuntos de códigos-fonte, mDataChanged = true;então não tenho certeza se isso resulta em um melhor desempenho em comparação comnotifyDataSetChanged()
vovahost
Você salvou meu dia, cara!
Oskarko
você pode pegar um tipo de lista que é "lista observável", não é necessário notificar o dataet alterado
Priya
153
Por favor, ignore todo o invalidate(), invalidateViews(),requestLayout() , ... respostas para essa pergunta.
Se a chamada notifyDataSetChanged()não funcionar, todos os métodos de layout também não ajudarão. Acredite em mimListView foi atualizado corretamente. Se você não encontrar a diferença, precisará verificar de onde vêm os dados no seu adaptador.
Se esta é apenas uma coleção que você está mantendo na memória, verifique se você realmente excluiu ou adicionou os itens à coleção antes de chamar o notifyDataSetChanged().
Se você estiver trabalhando com um banco de dados ou serviço de back-end, precisará chamar o método para recuperar as informações novamente (ou manipular os dados da memória) antes de chamar o notifyDataSetChanged().
A coisa é essa notifyDataSetChanged só funciona se o conjunto de dados tiver sido alterado. Portanto, esse é o lugar para procurar, se você não encontrar mudanças. Depure se necessário.
ArrayAdapter vs BaseAdapter
Descobri que trabalhar com um adaptador que permite gerenciar a coleção, como um BaseAdapter, funciona melhor. Alguns adaptadores como o ArrayAdapter já gerenciam sua própria coleção, dificultando o acesso à coleção adequada para atualizações. Na verdade, é apenas uma camada extra desnecessária de dificuldade na maioria dos casos.
Thread da interface do usuário
É verdade que isso precisa ser chamado do thread da interface do usuário. Outras respostas têm exemplos de como conseguir isso. No entanto, isso é necessário apenas se você estiver trabalhando nessas informações fora do segmento da interface do usuário. Isso é de um serviço ou de um segmento que não é da interface do usuário. Em casos simples, você estará atualizando seus dados com um clique no botão ou outra atividade / fragmento. Ainda dentro do segmento da interface do usuário. Não é necessário sempre exibir o runOnUiTrhead.
Projeto de exemplo rápido
Pode ser encontrado em https://github.com/hanscappelle/so-2250770.git . Basta clonar e abrir o projeto no Android Studio (gradle). Este projeto tem uma MainAcitivity construindo umListView com todos os dados aleatórios. Esta lista pode ser atualizada usando o menu de ação.
A implementação do adaptador que criei para este exemplo ModelObject expõe a coleta de dados
publicclassMyListAdapterextendsBaseAdapter{/**
* this is our own collection of data, can be anything we
* want it to be as long as we get the abstract methods
* implemented using this data and work on this data
* (see getter) you should be fine
*/privateList<ModelObject> mData;/**
* our ctor for this adapter, we'll accept all the things
* we need here
*
* @param mData
*/publicMyListAdapter(finalContext context,finalList<ModelObject> mData){this.mData = mData;this.mContext = context;}publicList<ModelObject> getData(){return mData;}// implement all abstract methods here}
Código da MainActivity
publicclassMainActivityextendsActivity{privateMyListAdapter mAdapter;@Overrideprotectedvoid onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);ListView list =(ListView) findViewById(R.id.list);// create some dummy data hereList<ModelObject> objects = getRandomData();// and put it into an adapter for the list
mAdapter =newMyListAdapter(this, objects);
list.setAdapter(mAdapter);// mAdapter is available in the helper methods below and the // data will be updated based on action menu interactions// you could also keep the reference to the android ListView // object instead and use the {@link ListView#getAdapter()} // method instead. However you would have to cast that adapter // to your own instance every time}/**
* helper to show what happens when all data is new
*/privatevoid reloadAllData(){// get new modified random dataList<ModelObject> objects = getRandomData();// update data in our adapter
mAdapter.getData().clear();
mAdapter.getData().addAll(objects);// fire the event
mAdapter.notifyDataSetChanged();}/**
* helper to show how only changing properties of data
* elements also works
*/privatevoid scrambleChecked(){Random random =newRandom();// update data in our adapter, iterate all objects and // resetting the checked optionfor(ModelObject mo : mAdapter.getData()){
mo.setChecked(random.nextBoolean());}// fire the event
mAdapter.notifyDataSetChanged();}}
você está errado. notifyDataSetChanged () não funcionou para mim, mas invalidateViews () fez o certo.
babay 08/09/13
6
Eu tenho o problema em que os elementos reais da lista não mudam, por exemplo, a mesma quantidade de elementos. Mas o problema é que a maneira como são apresentadas precisa mudar. Isso significa que o código do meu adaptador para criar a interface do usuário precisa executar novamente e, em seguida, ocultar corretamente algum elemento nas linhas da lista. notifyDataSetChanged () não funciona ...
Sven Haiges
9
Esta resposta realmente me ajudou. Eu estava mantendo a matriz na memória por certos motivos de recursos. Para corrigi-lo, eu ligo agora adapter.clear(), e adapter.addAll(Array<T>)antes de ligarnotifyDataSetChanged()
Michael DePhillips
2
@ hcpl, como devo chamar notifyDataSetChanged se estiver no OnClickListener do adaptador para uma CheckBox? invalidateViews está fazendo o trabalho agora. Por que invalidateViews é o método errado para chamar?
craned
1
Eu nunca consegui obter o notifyDataSetChanged funcionando. Pude ver claramente que a coleção que alimento no adaptador foi alterada (os elementos foram removidos), mas o notifyDataSetChanged nunca fez nada. Não tem certeza se este método está quebrado?
Byemute 22/10/2015
42
Ligue para executar quando quiser:
runOnUiThread(run);
OnCreate(), você define seu thread executável:
run =newRunnable(){publicvoid run(){//reload content
arraylist.clear();
arraylist.addAll(db.readAll());
adapter.notifyDataSetChanged();
listview.invalidateViews();
listview.refreshDrawableState();}};
Trabalhando também no meu caso, em que preciso atualizar uma exibição de lista com base nos dados provenientes de uma conexão TCP (de um thread "nonUI"). A única maneira de redesenhar a lista era limpar e adicionar novamente todos os elementos do ArrayList. De qualquer forma, se você já está no segmento da interface do usuário, não precisa chamar o código por meio da runOnUiThread()função
Andre Andre
Obrigado! Funciona para mim. Para todas as pessoas que querem executar este a partir de um fragmento, você deve usar getActivity () runOnUiThread (new Runnable ... para garantir que o código é executado no segmento.
codingpuss
Não vejo o propósito run = new Runnable()e apenas dei à minha função um public void refreshUIThread()método que modela o seu run()método (que também funciona).
T.Woody
11
Eu tenho alguns problemas com a atualização dinâmica do meu listview.
Ligue para notifyDataSetChanged () no seu adaptador.
Algumas informações adicionais sobre como / quando chamar notifyDataSetChanged () podem ser visualizadas neste vídeo de E / S do Google.
notifyDataSetChanged () não funcionou corretamente no meu caso [chamei o notifyDataSetChanged de outra classe]. Apenas no caso, editei o ListView na atividade em execução (Thread). Esse vídeo, graças a Christopher, deu a dica final.
Na minha segunda aula eu usei
Runnable run =newRunnable(){publicvoid run(){
contactsActivity.update();}};
contactsActivity.runOnUiThread(run);
para acessar a atualização () da minha Atividade. Esta atualização inclui
myAdapter.notifyDataSetChanged();
para dizer ao adaptador para atualizar a exibição. Funcionou bem, tanto quanto eu posso dizer.
Se você ainda não estiver satisfeito com o Refreshment do ListView, pode ver este trecho, isto é, para carregar o listView do DB. Na verdade, o que você precisa fazer é simplesmente recarregar o ListView, depois de executar qualquer operação CRUD. Não é a melhor maneira de código, mas atualizará o ListView como desejar.
Funciona para Mim .... se você encontrar uma solução melhor, por favor Compartilhe ...
.......
......
faça suas operações CRUD ..
......
.....
DBAdapter.open ();
DBAdapter.insert_into_SingleList ();
// Traga esse DB_results e adicione-o à lista como seu conteúdo ....
ls2.setAdapter (novo ArrayAdapter (DynTABSample.this,
android.R.layout.simple_list_item_1, DBAdapter.DB_ListView));
DBAdapter.close ();
As soluções propostas pelas pessoas nesta postagem funcionam ou não, dependendo principalmente da versão Android do seu dispositivo. Por exemplo, para usar o método AddAll, você deve colocar android: minSdkVersion = "10" no seu dispositivo Android.
Para resolver essas questões para todos os dispositivos, criei meu próprio método no meu adaptador e uso dentro do método add and remove herdado do ArrayAdapter que atualiza seus dados sem problemas.
Meu código: usando minha própria classe de dados RaceResult, você usa seu próprio modelo de dados.
ResultGpRowAdapter.java
publicclassResultGpRowAdapterextendsArrayAdapter<RaceResult>{Context context;int resource;List<RaceResult> data=null;publicResultGpRowAdapter(Context context,int resource,List<RaceResult> objects){super(context, resource, objects);this.context = context;this.resource = resource;this.data = objects;}@OverridepublicView getView(int position,View convertView,ViewGroup parent){........}//my own method to populate data publicvoid myAddAll(List<RaceResult> items){for(RaceResult item:items){super.add(item);}}
ResultsGp.java
publicclassResultsGpextendsActivity{@Overrideprotectedvoid onCreate(Bundle savedInstanceState){......................ListView list =(ListView)findViewById(R.id.resultsGpList);ResultGpRowAdapter adapter =newResultGpRowAdapter(this, R.layout.activity_result_gp_row,newArrayList<RaceResult>());//Empty data
list.setAdapter(adapter);............//LOAD a ArrayList<RaceResult> with dataArrayList<RaceResult> data =newArrayList<RaceResult>();
data.add(newRaceResult(....));
data.add(newRaceResult(....));.......
adapter.myAddAll(data);//Your list will be udpdated!!!
Você precisa usar um único objeto dessa lista em que dados você está inflando ListView. Se a referência for alterada, notifyDataSetChanged()não funcionará. Sempre que você estiver excluindo elementos da exibição em lista, exclua-os da lista que está usando, seja um ArrayList <> ou Algo mais, em seguida, Chame o
notifyDataSetChanged()objeto da classe do seu adaptador.
Então veja aqui como eu consegui no meu adaptador veja abaixo
Não consegui que o notifyDataSetChanged () funcionasse para atualizar meu SimpleAdapter; então, tentei primeiro remover todas as visualizações que estavam anexadas ao layout pai usando removeAllViews (), depois adicionar o ListView e funcionou, permitindo atualizar o UI:
Para mim, depois de alterar as informações no banco de dados sql, nada poderia atualizar a exibição de lista (para ser uma exibição de lista expansível específica); portanto, se notifyDataSetChanged () não ajudar, tente limpar sua lista primeiro e adicioná-la novamente depois dessa chamada notifyDataSetChanged (). Por exemplo
Eu era o mesmo quando, em um fragmento, queria preencher um ListView (em um único TextView) com o endereço mac de dispositivos BLE digitalizados por algum tempo.
Eu acho que depende do que você quer dizer com atualização. Você quer dizer que a exibição da GUI deve ser atualizada ou as exibições filho devem ser atualizadas para que você possa chamar programaticamente getChildAt (int) e obter a exibição correspondente ao que está no adaptador.
Se você deseja que a exibição da GUI seja atualizada, chame notifyDataSetChanged () no adaptador. A GUI será atualizada quando o próximo redesenho.
Se você deseja chamar getChildAt (int) e obter uma visualização que reflita o que está no adaptador, ligue para layoutChildren (). Isso fará com que a exibição filho seja reconstruída a partir dos dados do adaptador.
Eu tinha um ArrayList que queria exibir em uma lista. ArrayList continha elementos do mysql. Eu substituí o método onRefresh e nesse método usei tablelayout.removeAllViews (); e depois repetiu o processo para obter dados novamente do banco de dados. Porém, antes disso, limpe seu ArrayList ou qualquer estrutura de dados, ou então novos dados serão anexados ao antigo.
Se você deseja atualizar a exibição da lista da interface do usuário a partir de um serviço, torne o adaptador estático em sua atividade Principal e faça o seguinte:
Se você estiver seguindo as diretrizes do Android e estiver usando o ContentProviderspara obter dados Databasee estiver exibindo-o ListViewnoCursorLoader e CursorAdapters, todas as alterações nos dados relacionados serão refletidas automaticamente no ListView.
Seu getContext().getContentResolver().notifyChange(uri, null); cursor no ContentProviderserá suficiente para refletir as alterações. Não há necessidade de trabalho extra.
Mas quando você não estiver usando tudo isso, precisará informar ao adaptador quando o conjunto de dados está sendo alterado. Você também precisa preencher novamente / recarregar seu conjunto de dados (por exemplo, lista) e, em seguida, ligar paranotifyDataSetChanged() para o adaptador.
notifyDataSetChanged()não funcionará se não houver alterações no conjunto de dados. Aqui está o comentário acima do método nos documentos
/**
* Notifies the attached observers that the underlying data has been changed
* and any View reflecting the data set should refresh itself.
*/
Eu só consegui obter notifyDataSetChanged apenas obtendo novos dados do adaptador, redefinindo o adaptador para a exibição em lista e fazendo a chamada da seguinte maneira:
Se eu falei sobre o meu cenário aqui, as respostas que não estão acima não funcionarão porque eu tinha uma atividade que mostra a lista de valores de banco de dados junto com um botão de exclusão e quando um botão de exclusão é pressionado, eu queria excluir esse item da lista.
O legal é que eu não usei a exibição do reciclador, mas uma exibição de lista simples e essa exibição de lista inicializada na classe do adaptador. Portanto, chamar o notifyDataSetChanged()não fará nada dentro da classe do adaptador e mesmo na classe de atividade em que o objeto do adaptador é inicializado porque o método delete estava na classe do adaptador.
Portanto, a solução foi remover o objeto do adaptador no getViewmétodo de classe do adaptador (para excluir apenas esse objeto específico, mas se você quiser excluir tudo, chameclear() ).
Para você ter uma ideia, como era meu código,
publicclassWordAdapterextendsArrayAdapter<Word>{Context context;publicWordAdapter(Activity context,ArrayList<Word> words){}//.......@NonNull@OverridepublicView getView(finalint position,View convertView,ViewGroupgroup){//.......ImageButton deleteBt = listItemView.findViewById(R.id.word_delete_bt);
deleteBt.setOnClickListener(newView.OnClickListener(){@Overridepublicvoid onClick(View v){if(vocabDb.deleteWord(currentWord.id)){//.....}else{//.....}remove(getItem(position));// <---- here is the trick ---<//clear() // if you want to clear everything}});//....
Nota: aqui remove()e getItem()métodos são herdados da classe Adapter.
remove() - para remover o item específico clicado
getItem(position) - é obter o item (aqui, esse é o meu objeto do Word que eu adicionei à lista) da posição clicada.
É assim que eu configuro o adaptador para o listview na classe de atividade,
Respostas:
Chame
notifyDataSetChanged()
seuAdapter
objeto depois de modificar os dados nesse adaptador.Algumas informações adicionais sobre como / quando ligar
notifyDataSetChanged()
podem ser visualizadas neste vídeo de E / S do Google .fonte
Também você pode usar isso:
fonte
invalidateViews()
nos conjuntos de códigos-fonte,mDataChanged = true;
então não tenho certeza se isso resulta em um melhor desempenho em comparação comnotifyDataSetChanged()
Por favor, ignore todo o
invalidate()
,invalidateViews()
,requestLayout()
, ... respostas para essa pergunta.A coisa certa a fazer (e felizmente também marcada como resposta certa) é ligar
notifyDataSetChanged()
para o seu adaptador .Solução de problemas
Se a chamada
notifyDataSetChanged()
não funcionar, todos os métodos de layout também não ajudarão. Acredite em mimListView
foi atualizado corretamente. Se você não encontrar a diferença, precisará verificar de onde vêm os dados no seu adaptador.Se esta é apenas uma coleção que você está mantendo na memória, verifique se você realmente excluiu ou adicionou os itens à coleção antes de chamar o
notifyDataSetChanged()
.Se você estiver trabalhando com um banco de dados ou serviço de back-end, precisará chamar o método para recuperar as informações novamente (ou manipular os dados da memória) antes de chamar o
notifyDataSetChanged()
.A coisa é essa
notifyDataSetChanged
só funciona se o conjunto de dados tiver sido alterado. Portanto, esse é o lugar para procurar, se você não encontrar mudanças. Depure se necessário.ArrayAdapter vs BaseAdapter
Descobri que trabalhar com um adaptador que permite gerenciar a coleção, como um BaseAdapter, funciona melhor. Alguns adaptadores como o ArrayAdapter já gerenciam sua própria coleção, dificultando o acesso à coleção adequada para atualizações. Na verdade, é apenas uma camada extra desnecessária de dificuldade na maioria dos casos.
Thread da interface do usuário
É verdade que isso precisa ser chamado do thread da interface do usuário. Outras respostas têm exemplos de como conseguir isso. No entanto, isso é necessário apenas se você estiver trabalhando nessas informações fora do segmento da interface do usuário. Isso é de um serviço ou de um segmento que não é da interface do usuário. Em casos simples, você estará atualizando seus dados com um clique no botão ou outra atividade / fragmento. Ainda dentro do segmento da interface do usuário. Não é necessário sempre exibir o runOnUiTrhead.
Projeto de exemplo rápido
Pode ser encontrado em https://github.com/hanscappelle/so-2250770.git . Basta clonar e abrir o projeto no Android Studio (gradle). Este projeto tem uma MainAcitivity construindo um
ListView
com todos os dados aleatórios. Esta lista pode ser atualizada usando o menu de ação.A implementação do adaptador que criei para este exemplo ModelObject expõe a coleta de dados
Código da MainActivity
Mais Informações
Outro bom post sobre o poder do listViews é encontrado aqui: http://www.vogella.com/articles/AndroidListView/article.html
fonte
adapter.clear()
, eadapter.addAll(Array<T>)
antes de ligarnotifyDataSetChanged()
Ligue para executar quando quiser:
OnCreate()
, você define seu thread executável:fonte
runOnUiThread()
funçãorun = new Runnable()
e apenas dei à minha função umpublic void refreshUIThread()
método que modela o seurun()
método (que também funciona).Eu tenho alguns problemas com a atualização dinâmica do meu listview.
notifyDataSetChanged () não funcionou corretamente no meu caso [chamei o notifyDataSetChanged de outra classe]. Apenas no caso, editei o ListView na atividade em execução (Thread). Esse vídeo, graças a Christopher, deu a dica final.
Na minha segunda aula eu usei
para acessar a atualização () da minha Atividade. Esta atualização inclui
para dizer ao adaptador para atualizar a exibição. Funcionou bem, tanto quanto eu posso dizer.
fonte
Se você estiver usando o SimpleCursorAdapter, tente chamar requery () no objeto Cursor.
fonte
Se você ainda não estiver satisfeito com o Refreshment do ListView, pode ver este trecho, isto é, para carregar o listView do DB. Na verdade, o que você precisa fazer é simplesmente recarregar o ListView, depois de executar qualquer operação CRUD. Não é a melhor maneira de código, mas atualizará o ListView como desejar.
Funciona para Mim .... se você encontrar uma solução melhor, por favor Compartilhe ...
fonte
As soluções propostas pelas pessoas nesta postagem funcionam ou não, dependendo principalmente da versão Android do seu dispositivo. Por exemplo, para usar o método AddAll, você deve colocar android: minSdkVersion = "10" no seu dispositivo Android.
Para resolver essas questões para todos os dispositivos, criei meu próprio método no meu adaptador e uso dentro do método add and remove herdado do ArrayAdapter que atualiza seus dados sem problemas.
Meu código: usando minha própria classe de dados RaceResult, você usa seu próprio modelo de dados.
ResultGpRowAdapter.java
ResultsGp.java
fonte
Se você deseja manter sua posição de rolagem ao atualizar e pode fazer isso:
Para obter informações detalhadas, consulte Android ListView: mantenha sua posição de rolagem ao atualizar .
fonte
Basta usar
myArrayList.remove(position);
dentro de um ouvinte:fonte
Você precisa usar um único objeto dessa lista em que dados você está inflando
ListView
. Se a referência for alterada,notifyDataSetChanged()
não funcionará. Sempre que você estiver excluindo elementos da exibição em lista, exclua-os da lista que está usando, seja um ArrayList <> ou Algo mais, em seguida, Chame onotifyDataSetChanged()
objeto da classe do seu adaptador.Então veja aqui como eu consegui no meu adaptador veja abaixo
fonte
Após excluir os dados da exibição em lista, você deve ligar
refreshDrawableState()
. Aqui está o exemplo:e
deleteContact
método emDatabaseHelper
sala de aula será um pouco parecido comfonte
Não consegui que o notifyDataSetChanged () funcionasse para atualizar meu SimpleAdapter; então, tentei primeiro remover todas as visualizações que estavam anexadas ao layout pai usando removeAllViews (), depois adicionar o ListView e funcionou, permitindo atualizar o UI:
fonte
Para mim, depois de alterar as informações no banco de dados sql, nada poderia atualizar a exibição de lista (para ser uma exibição de lista expansível específica); portanto, se notifyDataSetChanged () não ajudar, tente limpar sua lista primeiro e adicioná-la novamente depois dessa chamada notifyDataSetChanged (). Por exemplo
Espero que faça sentido para você.
fonte
enquanto estiver usando o SimpleCursorAdapter, é possível chamar changeCursor (newCursor) no adaptador.
fonte
Eu era o mesmo quando, em um fragmento, queria preencher um ListView (em um único TextView) com o endereço mac de dispositivos BLE digitalizados por algum tempo.
O que eu fiz foi o seguinte:
Em seguida, o ListView começou a preencher dinamicamente com o endereço mac dos dispositivos encontrados.
fonte
Eu acho que depende do que você quer dizer com atualização. Você quer dizer que a exibição da GUI deve ser atualizada ou as exibições filho devem ser atualizadas para que você possa chamar programaticamente getChildAt (int) e obter a exibição correspondente ao que está no adaptador.
Se você deseja que a exibição da GUI seja atualizada, chame notifyDataSetChanged () no adaptador. A GUI será atualizada quando o próximo redesenho.
Se você deseja chamar getChildAt (int) e obter uma visualização que reflita o que está no adaptador, ligue para layoutChildren (). Isso fará com que a exibição filho seja reconstruída a partir dos dados do adaptador.
fonte
Eu tinha um ArrayList que queria exibir em uma lista. ArrayList continha elementos do mysql. Eu substituí o método onRefresh e nesse método usei tablelayout.removeAllViews (); e depois repetiu o processo para obter dados novamente do banco de dados. Porém, antes disso, limpe seu ArrayList ou qualquer estrutura de dados, ou então novos dados serão anexados ao antigo.
fonte
Se você deseja atualizar a exibição da lista da interface do usuário a partir de um serviço, torne o adaptador estático em sua atividade Principal e faça o seguinte:
fonte
Se você estiver seguindo as diretrizes do Android e estiver usando o
ContentProviders
para obter dadosDatabase
e estiver exibindo-oListView
noCursorLoader
eCursorAdapters
, todas as alterações nos dados relacionados serão refletidas automaticamente no ListView.Seu
getContext().getContentResolver().notifyChange(uri, null);
cursor noContentProvider
será suficiente para refletir as alterações. Não há necessidade de trabalho extra.Mas quando você não estiver usando tudo isso, precisará informar ao adaptador quando o conjunto de dados está sendo alterado. Você também precisa preencher novamente / recarregar seu conjunto de dados (por exemplo, lista) e, em seguida, ligar para
notifyDataSetChanged()
para o adaptador.notifyDataSetChanged()
não funcionará se não houver alterações no conjunto de dados. Aqui está o comentário acima do método nos documentosfonte
Eu só consegui obter notifyDataSetChanged apenas obtendo novos dados do adaptador, redefinindo o adaptador para a exibição em lista e fazendo a chamada da seguinte maneira:
fonte
em outra opção é o
onWindowFocusChanged
método, mas com certeza é sensível e precisa de uma codificação extra para quem está interessadofonte
Considere que você passou uma lista para o seu adaptador.
Usar:
list.getAdapter().notifyDataSetChanged()
para atualizar sua lista.
fonte
Se eu falei sobre o meu cenário aqui, as respostas que não estão acima não funcionarão porque eu tinha uma atividade que mostra a lista de valores de banco de dados junto com um botão de exclusão e quando um botão de exclusão é pressionado, eu queria excluir esse item da lista.
O legal é que eu não usei a exibição do reciclador, mas uma exibição de lista simples e essa exibição de lista inicializada na classe do adaptador. Portanto, chamar o
notifyDataSetChanged()
não fará nada dentro da classe do adaptador e mesmo na classe de atividade em que o objeto do adaptador é inicializado porque o método delete estava na classe do adaptador.Portanto, a solução foi remover o objeto do adaptador no
getView
método de classe do adaptador (para excluir apenas esse objeto específico, mas se você quiser excluir tudo, chameclear()
).Para você ter uma ideia, como era meu código,
Nota: aqui
remove()
egetItem()
métodos são herdados da classe Adapter.remove()
- para remover o item específico clicadogetItem(position)
- é obter o item (aqui, esse é o meu objeto do Word que eu adicionei à lista) da posição clicada.É assim que eu configuro o adaptador para o listview na classe de atividade,
fonte
O mais fácil é fazer um novo Adaper e largar o antigo:
fonte