because performFiltering
executes in worker thread. And you assign your searchTextAutoSuggestList variable in this thread, but you have to change data of the adapter only in UI thread. Also publishResults
method executes in UI thread so you don't need any Handlers here.
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults filterResults = new FilterResults();
synchronized (filterResults) {
if (constraint != null) {
// Clear and Retrieve the autocomplete results.
List<SearchTextAutoSuggest> resultList = getFilteredResults(constraint);
// Assign the data to the FilterResults
filterResults.values = resultList;
filterResults.count = resultList.size();
}
return filterResults;
}
}
@Override
protected void publishResults(CharSequence constraint, final FilterResults filterResults) {
if (filterResults != null && filterResults.count > 0) {
searchTextAutoSuggestList.clear();
searchTextAutoSuggestList = filterResults.values;
notifyDataSetChanged();
} else {
Logs.e("Tried to invalidate");
notifyDataSetInvalidated();
}
}