java - 如何解决 "The content of the adapter has changed but ListView did not receive a notification”异常

标签 java android android-layout android-adapter autocompletetextview

<分区>

我发现了很多关于同一主题的问题。但是我无法弄清楚我在这里做错了什么。

异常: “适配器的内容已更改,但 ListView 未收到通知。确保适配器的内容未从后台线程修改,而仅从 UI 线程修改”

我的 AutoCompleteTextView 有一个 TextWatcher。我正在尝试在文本更改时更新下拉列表。我正在从两个不同的来源获取下拉列表的数据。它们中的每一个都在不同的线程中运行。

mTextWatcher = new TextWatcher() {
        public void afterTextChanged(Editable editable) {           
        }

        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
        }

        public void onTextChanged(CharSequence s, int start, int before,
                int count) {
            suggestionNewText = s.toString();
            list = new ArrayList<Map<String, String>>();
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                     //data processing
                     list.add(data);
                     handler.sendEmptyMessage(1);
                            }
                        });

            Thread webAutoComplete = new Thread(new Runnable() {
                       @Override
                       public void run() {
                              //data process
                              list.add(data);
                              handler.sendEmptyMessage(1);
            }
            });

            try {
                     webAutoComplete.start();
                } catch (NullPointerException e) {
                } catch (IllegalStateException e) {
             }                      
        }
    };

适配器的处理程序位于文本观察器旁边。

    handler = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case 1: {

                ((Activity) CONTEXT).runOnUiThread(new Runnable() {
                    public void run() {
                        try {
                            if (list != null)

                            suggestionAdapter = new UrlSuggestionAdapter(
                                    CONTEXT,
                                    list,
                                    R.layout.two_line_autocomplete,
                                    new String[] { "title", "url" },
                                    new int[] { R.id.title, R.id.url
                                             });
                            if (list != null) {
                                refreshAdapter(list);
                                getUrl.setAdapter(suggestionAdapter);

                            }

                        } catch (Exception e) {

                        }
                    }
                });
                break;
            }
            case 2: {
                break;
            }
            }
        }
    };



public synchronized void refreshAdapter(List<Map<String, String>> items) {

    list = items;
    if (list != null) {

        suggestionAdapter.notifyDataSetChanged();
    }
}

上面的全部代码都在 Activity 的 OnCreate() 方法中。我不总是得到异常(exception)。它发生在特定的场合。此问题尚未解决。我在创建适配器后添加了 notifydatasetchanged() 方法。仍然不能解决问题。谁能指出我在这里做错了什么?

最佳答案

通过添加修复错误

suggestionAdapter.notifyDataSetChanged();

每当列表发生变化时,而不是在 n 次插入后调用它。

关于java - 如何解决 "The content of the adapter has changed but ListView did not receive a notification”异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18999493/

相关文章:

android - 我真的需要多少布局资源文件夹来覆盖所有 Android 设备

java - INT64和DECIMAL(18,6)在Parquet文件格式中意味着什么?

android - 在 Android 的自定义启动器中创建应用程序快捷方式

java - 如何使 SwipeRefreshLayout 不可滑动?

android - 使用 Intent 调用多个 Activity

android - 具有与 gridview 相同行为的布局?

java - 访问整数中的各个位,为什么需要使用>>?

java - 我如何在 asynctask 中创建 arrayadapter。执行后

java - 我应该使用 Executor 只运行 1 个 Runnable 吗?何时使用执行者?

android - 如何隐藏 ActionBar 的图标?