I'm trying to use in my Android Application
the notifyDataSetChanged()
method for an ArrayAdapter
but it doesn't work for me.
I found as answer here, that notifyDataSetChanged()
should run in the main thread, but there was no example for that.
Could anybody send an example or at least a link?!
You can use the
runOnUiThread()
method as follows. If you're not using aListActivity
, just adapt the code to get a reference to yourArrayAdapter
.I know this is a late response but I was facing a similar issue and I managed to solve it by using
notifyDataSetChanged()
in the right place.So my situation was as follows.
I had to update a listview in an action bar tab (fragment) with contents returned from a completely different activity. Initially however, the listview would not reflect any changes. However, when I clicked another tab and then returned to the desired tab,the listview would be updated with the correct content from the other activity. So to solve this I used
notifyDataSetChanged()
of the action bar adapter in the code of the activity which had to return the data.This is the code snippet which I used in the activity.
This activity would return some data to
FragmentTab2
and it would directly update my listview inFragmentTab2
.Hope someone finds this useful!
I recently wrote on this topic, though this post it old, I thought it will be helpful to someone who wants to know how to implement
BaseAdapter.notifyDataSetChanged()
step by step and in a correct way.Please follow How to correctly implement BaseAdapter.notifyDataSetChanged() in Android or the newer blog BaseAdapter.notifyDataSetChanged().
I had the same problem and I prefer not to replace the entire ArrayAdapter with a new instance continuously. Thus I have the AdapterHelper do the heavy lifting somewhere else.
Add this where you would normally (try to) call notify
AdapterHelper class
For an
ArrayAdapter
,notifyDataSetChanged
only works if you use theadd()
,insert()
,remove()
, andclear()
on the Adapter.When an
ArrayAdapter
is constructed, it holds the reference for theList
that was passed in. If you were to pass in aList
that was a member of an Activity, and change that Activity member later, theArrayAdapter
is still holding a reference to the originalList
. The Adapter does not know you changed theList
in the Activity.Your choices are:
ArrayAdapter
to modify the underlying List (add()
,insert()
,remove()
,clear()
, etc.)ArrayAdapter
with the newList
data. (Uses a lot of resources and garbage collection.)BaseAdapter
andListAdapter
that allows changing of the underlyingList
data structure.notifyDataSetChanged()
every time the list is updated. To call it on the UI-Thread, use therunOnUiThread()
ofActivity
. Then,notifyDataSetChanged()
will work.