artworkad シ artworkad シ - 2 months ago 33x
Android Question

Error using notifyDataSetChanged in android array adapter

11-06 19:52:25.958: E/AndroidRuntime(29609):
java.lang.IllegalStateException: The content of the adapter has
changed but ListView did not receive a notification. Make sure the
content of your adapter is not modified from a background thread, but
only from the UI thread. [in ListView(-1, class
android.widget.ListPopupWindow$DropDownListView) with Adapter(class

Full log:

Full code of adapter: I am using the example from and it has quite the default code so it seems there is a bug in the google code?

The app crashes only sometimes with the above error message.

protected void publishResults(CharSequence constraint,
FilterResults results) {

if (results != null && results.count > 0) {
} else {


public class CityActivity extends Activity{

protected void onCreate(Bundle savedInstanceState) {

AutoCompleteTextView autoCompView = (AutoCompleteTextView) findViewById(;

PlacesAutoCompleteAdapter ad = new PlacesAutoCompleteAdapter(this);
ProgressBar b = (ProgressBar)findViewById(;


Any ideas how to fix this? I am on android 4.3.


The Filter's performFiltering() method runs on a background thread and from that method you're changing the resultList on which your adapter is based. If you change that list of data and in that time the ListView access the adapter it will see that something has changed without its knowledge(and it will not be happy). You should avoid using the resultList in the performFiltering method and simply create a new temporary list:

// in the performFiltering method which runs on a background thread:
protected FilterResults performFiltering(CharSequence constraint) {
     FilterResults filterResults = new FilterResults();
     ArrayList<String> queryResults;
     if (constraint != null && constraint.length() > 0) {
         queryResults = autocomplete(constraint);
     } else {
         queryResults = new ArrayList<String>(); // empty list/no suggestions showing if there's no valid constraint
     filterResults.values = queryResults;
     filterResults.count = queryResults.size();
     return filterResults; // ## Heading ##

private List<String> autocomplete(String input) {
   // don't use the here the resultList List on which the adapter is based!
   // some custom code to get items from http connection
     ArrayList<String> queryResults = new ArrayList<String>(); // new list
     queryResults.add("Some String");
     return queryResults;

protected void publishResults(CharSequence constraint, FilterResults results) {
     // update the data with the new set of suggestions
     resultList = (ArrayList<String>)results.values;
     if (results.count > 0) {
     } else {