使用Android的阵列适配器notifyDataSetChanged错误 [英] Error using notifyDataSetChanged in android array adapter
问题描述
11-06 19:52:25.958:E / AndroidRuntime(29609): java.lang.IllegalStateException:适配器的内容具有 改变,但ListView控件没有收到通知。确认 适配器的内容不会从后台线程修改,但 只能从UI线程。 [ListView中(-1,类 android.widget.ListPopupWindow $ DropDownListView)与适配器(类 com.example.parkfoxxlight_android.PlacesAutoCompleteAdapter)]
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 com.example.parkfoxxlight_android.PlacesAutoCompleteAdapter)]
完整日志: http://pastebin.com/Hx7k28Rm
适配器全部code: http://pastebin.com/TfH1bXE3 我使用的是例如,从<一个href="https://developers.google.com/places/training/autocomplete-android">https://developers.google.com/places/training/autocomplete-android它具有相当的默认code所以似乎没有在谷歌code一个错误?
Full code of adapter: http://pastebin.com/TfH1bXE3 I am using the example from https://developers.google.com/places/training/autocomplete-android 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) {
notifyDataSetChanged();
} else {
notifyDataSetInvalidated();
}
}
活动 http://pastebin.com/FYzYtvXY :
public class CityActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.city);
AutoCompleteTextView autoCompView = (AutoCompleteTextView) findViewById(R.id.autocomplete_city);
PlacesAutoCompleteAdapter ad = new PlacesAutoCompleteAdapter(this);
ProgressBar b = (ProgressBar)findViewById(R.id.progressBar1);
ad.setLoadingIndicator(b);
autoCompView.setAdapter(ad);
}
}
任何想法如何解决这一问题?我在Android 4.3。
Any ideas how to fix this? I am on android 4.3.
推荐答案
在过滤器
的 performFiltering()
方法运行在后台线程,并从方法,你正在改变 resultList
上您的适配器的基础。如果更改数据和的ListView在这个时候,名单
进入该适配器将看到的东西已经没有了知识改变(这会不高兴)。你应该避免使用 resultList
在 performFiltering
方法和简单地创建一个新的临时列表:
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:
@Override
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();
}
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;
}
@Override
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) {
notifyDataSetChanged();
} else {
notifyDataSetInvalidated();
}
}
这篇关于使用Android的阵列适配器notifyDataSetChanged错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!