Eu estou tentando usar no meu Android Application
o notifyDataSetChanged()
método para um ArrayAdapter
, mas ele não funciona para mim.
Eu encontrei como resposta aqui , que notifyDataSetChanged()
deve ser executado no thread principal, mas não havia exemplo para isso.
Alguém poderia enviar um exemplo ou pelo menos um link ?!
Respostas:
Para um
ArrayAdapter
,notifyDataSetChanged
só funciona se você usar oadd()
,insert()
,remove()
, eclear()
no adaptador.Quando um
ArrayAdapter
é construído, ele mantém a referência doList
que foi passado. Se você fosse passar umList
que era membro de uma Atividade e alterá-lo mais tarde, eleArrayAdapter
ainda mantém uma referência ao originalList
. O adaptador não sabe que você alterou oList
na atividade.Suas escolhas são:
ArrayAdapter
para modificar a lista subjacente (add()
,insert()
,remove()
,clear()
, etc.)ArrayAdapter
com os novosList
dados. (Usa muitos recursos e coleta de lixo.)BaseAdapter
eListAdapter
que permita a alteração daList
estrutura de dados subjacente .notifyDataSetChanged()
sempre que a lista for atualizada. Para chamá-lo no UI-Thread, use orunOnUiThread()
deActivity
. Então,notifyDataSetChanged()
vai funcionar.fonte
notifyDataSetChanged()
dessa maneira((BaseAdapter) arrayAdapter).notifyDataSetChanged();
:?Você pode usar o
runOnUiThread()
método da seguinte maneira. Se você não estiver usando aListActivity
, basta adaptar o código para obter uma referência ao seuArrayAdapter
.fonte
Eu escrevi recentemente sobre esse tópico, embora este post seja antigo, achei que seria útil para alguém que deseja saber como implementar
BaseAdapter.notifyDataSetChanged()
passo a passo e de maneira correta.Siga Como implementar corretamente BaseAdapter.notifyDataSetChanged () no Android ou o blog mais recente BaseAdapter.notifyDataSetChanged () .
fonte
mItem.add()
, eu fiz apenas a edição de um elemento,mItem.get(position).setImage(encodedImage)
pode ser que seja por isso que está dando a exceção de NullPointer de erro. somente para add (), clear (), remove () etc #Eu tive o mesmo problema e prefiro não substituir o ArrayAdapter inteiro por uma nova instância continuamente. Portanto, eu tenho o AdapterHelper fazendo o trabalho pesado em outro lugar.
Adicione isto onde você normalmente (tentaria) ligar para notificar
Classe AdapterHelper
fonte
super.addAll(..)
API> 11 e super.add (.. ) em combinação com iteração como a sua:if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { super.addAll(items); } else { for (Object o : collection) { super.add(o); } }
. Agora basta estender sua nova classe de adaptadores.Sei que esta é uma resposta tardia, mas estava enfrentando um problema semelhante e consegui resolvê-lo usando
notifyDataSetChanged()
no lugar certo.Então, minha situação era a seguinte.
Eu tive que atualizar uma exibição de lista em uma guia da barra de ação (fragmento) com o conteúdo retornado de uma atividade completamente diferente. Inicialmente, no entanto, a exibição de lista não refletia nenhuma alteração. No entanto, ao clicar em outra guia e retornar à guia desejada, a exibição da lista seria atualizada com o conteúdo correto da outra atividade. Então, para resolver isso, usei
notifyDataSetChanged()
o adaptador da barra de ação no código da atividade que teve que retornar os dados.Este é o trecho de código que eu usei na atividade.
Essa atividade retornaria alguns dados
FragmentTab2
e atualizaria diretamente minha listview emFragmentTab2
.Espero que alguém ache isso útil!
fonte