diff options
| author | Bananeweizen <bananeweizen@gmx.de> | 2014-01-15 07:56:37 +0100 |
|---|---|---|
| committer | Bananeweizen <bananeweizen@gmx.de> | 2014-01-15 07:56:37 +0100 |
| commit | e83842077c5f5e3eb7005f1e9792f8b31ff63d94 (patch) | |
| tree | cc69cf8a51d18515931ef27fce6eb8f254af04b5 | |
| parent | 9315e8fa15fba2b4ad640544aeb88fb32666db9d (diff) | |
| download | cgeo-e83842077c5f5e3eb7005f1e9792f8b31ff63d94.zip cgeo-e83842077c5f5e3eb7005f1e9792f8b31ff63d94.tar.gz cgeo-e83842077c5f5e3eb7005f1e9792f8b31ff63d94.tar.bz2 | |
IllegalStateException in search suggestions
IllegalStateException: The content of the adapter has changed but
ListView did not receive a notification.
Occurred only seldom. The filter already switches between background and
UI thread, but the pointer to the result list was previously already
updated in the background thread.
| -rw-r--r-- | main/src/cgeo/geocaching/search/AutoCompleteAdapter.java | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/main/src/cgeo/geocaching/search/AutoCompleteAdapter.java b/main/src/cgeo/geocaching/search/AutoCompleteAdapter.java index c314bbe..123469c 100644 --- a/main/src/cgeo/geocaching/search/AutoCompleteAdapter.java +++ b/main/src/cgeo/geocaching/search/AutoCompleteAdapter.java @@ -15,7 +15,7 @@ import android.widget.Filter; */ public class AutoCompleteAdapter extends ArrayAdapter<String> { - private String[] results; + private String[] suggestions; private final Func1<String, String[]> suggestionFunction; public AutoCompleteAdapter(Context context, int textViewResourceId, final Func1<String, String[]> suggestionFunction) { @@ -25,12 +25,12 @@ public class AutoCompleteAdapter extends ArrayAdapter<String> { @Override public int getCount() { - return results.length; + return suggestions.length; } @Override public String getItem(int index) { - return results[index]; + return suggestions[index]; } @Override @@ -45,18 +45,20 @@ public class AutoCompleteAdapter extends ArrayAdapter<String> { } String trimmed = StringUtils.trim(constraint.toString()); if (StringUtils.length(trimmed) >= 2) { - results = suggestionFunction.call(trimmed); + String[] newResults = suggestionFunction.call(trimmed); - // Assign the data to the FilterResults - filterResults.values = results; - filterResults.count = results.length; + // Assign the data to the FilterResults, but do not yet store in the global member. + // Otherwise we might invalidate the adapter and cause an IllegalStateException. + filterResults.values = newResults; + filterResults.count = newResults.length; } return filterResults; } @Override - protected void publishResults(CharSequence constraint, FilterResults results) { - if (results != null && results.count > 0) { + protected void publishResults(CharSequence constraint, FilterResults filterResults) { + if (filterResults != null && filterResults.count > 0) { + suggestions = (String[]) filterResults.values; notifyDataSetChanged(); } else { |
