使用Android的阵列适配器notifyDataSetChanged错误 [英] Error using notifyDataSetChanged in android array adapter

查看:116
本文介绍了使用Android的阵列适配器notifyDataSetChanged错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆