IllegalStateException:适配器的内容已更改但ListView未收到通知

2023-11-26

我使用自定义 ArrayAdapter 在 AutocompleteTextView 上设置适配器(AddressAdapter 扩展 ArrayAdapter)。

public class AutoCompleteAdapter extends ArrayAdapter<String> implements Filterable {
private ArrayList<String> mData;
ArrayList<String> listTempPrefix = new ArrayList<String>();
ArrayList<String> listTemp = new ArrayList<String>();
String valueText;
String[] words;
String ulcase;

public AutoCompleteAdapter(Context context, int textViewResourceId, ArrayList<String> bS) {
    super(context, textViewResourceId);
    mData = bS;//new ArrayList<String>();
}

@Override
public int getCount()
{
    synchronized (listTempPrefix)
    {
        return listTempPrefix.size();
    }
}

@Override
public String getItem(int index)  
{
    synchronized (listTempPrefix)
    {
        try {
            //Log.e("Error", listTempPrefix.get(index));
            return listTempPrefix.get(index);
        } catch(IndexOutOfBoundsException e) {
            Log.e("Error", "IndexOutOfBoundsException");
            return "";
        }
    }

}

@Override
public Filter getFilter()
{
    Filter myFilter = new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence constraint)
        {

            FilterResults filterResults = new FilterResults();
            synchronized (filterResults)
            {
                listTempPrefix.clear();
                listTemp.clear();
                //Log.e("1", "1");

                try {
                if(constraint != null) {
                    // A class that queries a web API, parses the data and returns an ArrayList<Style>
                    //StyleFetcher fetcher = new StyleFetcher();
                    //try {
                        //mData = fetcher.retrieveResults(constraint.toString());
                    //}
                    //catch(Exception e) {}
                    // Now assign the values and count to the FilterResults object


                    for(String value: mData) {
                        valueText = value.toLowerCase();

                        //System.out.println("constraintH - " + constraint);

                        constraint.toString().toLowerCase();
                        ulcase = constraint.toString().toLowerCase();
                        //System.out.println("ulcase - " + ulcase);

                        if (valueText.startsWith(ulcase)) {
                            listTempPrefix.add(value);
                        } else {
                            words = valueText.split(" ");
                            //final int wordCount = words.length;

                            // Start at index 0, in case valueText starts with space(s)
                            for (int k = 0; k < words.length; k++) {
                                if (words[k].startsWith(ulcase)) {
                                    listTemp.add(value);
                                    break;
                                }
                            }
                        }

                        ///listTemp.add(mData.get(i));
                        //filterResults.count = mData.size();
           //           System.out.println("mData" + i + mData.get(i));
                    }
                    //Log.e("2", "2");
           //       System.out.println("size " + listTemp.size() + " value" + listTemp);

                    listTempPrefix.addAll(listTemp);

                    filterResults.values = listTempPrefix;

                    filterResults.count = listTempPrefix.size();
                    //System.out.println("size " + filterResults.count + " value" + filterResults.values);

                    //System.out.println("constraint" + constraint);

                }
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                    }
                return filterResults;
            }
        }

        @Override
        protected void publishResults(CharSequence contraint, FilterResults filterResults) 
        {
            synchronized (filterResults)
            {
                if(filterResults != null && filterResults.count > 0) {
                notifyDataSetChanged();
                //Log.e("notifyDataSetChanged", "notifyDataSetChanged");
                }
                else {
                    notifyDataSetInvalidated();
                    //Log.e("notifyDataSetInvalidated", "notifyDataSetInvalidated");
                }
            }
        }
    };
    return myFilter;
}

}

我有时会得到什么:请注意,这种情况很少发生。但我想完全摆脱这个错误。这是部分堆栈跟踪:

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.AutoCompleteTextView$DropDownListView) with Adapter(class com.example.test.AutoCompleteAdapter)].

问题可能是来自键盘的快速输入,方法notifyDataSetChanged()并不酷。但我不确定。


将发布结果更改为

@Override 
protected void publishResults(final CharSequence contraint, final FilterResults filterResults) { 
    listTempPrefix = (List) results.values;
    if(filterResults != null && filterResults.count > 0) {
        notifyDataSetChanged();
    } else {
        notifyDataSetInvalidated();
    }
}

这样,GUI 线程会更新结果,而不是在后台线程中运行的 PerformFiltering。

从 PerformFiltering 中删除 listTempPrefix 引用,并使用局部变量来存储结果并通过 FilterResults 返回结果

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

IllegalStateException:适配器的内容已更改但ListView未收到通知 的相关文章

随机推荐

  • 更改 R 中 ggplot 中组的顺序

    我在用ggplot绘制条形图 如何更改栏中组的顺序 在下面的示例中 我希望将 type 1984 作为第一堆条形图 然后将 type 1985 放在 1984 的顶部 依此类推 series lt data frame time c rep
  • Python 双向映射

    我不知道该怎样称呼我正在寻找的东西 因此 如果我未能在其他地方找到这个问题 我深表歉意 简而言之 我正在编写将直接与 Linux 内核交互的 python 代码 很容易从包含头文件中获取所需的值并将它们写入我的源代码 IFA UNSPEC
  • 将项目列表转换为树的好且通用的方法

    我有类别列表 Id Name Parent id 1 Sports 0 2 Balls 1 3 Shoes 1 4 Electronics 0 5 Cameras 4 6 Lenses 5 7 Tripod 5
  • PhantomJS 没有使用网络字体渲染屏幕截图?

    所以我一直在四处寻找 似乎找不到如何让 PhantomJS 在屏幕截图上实际显示网页字体的解决方案 有人能告诉我是否有办法做到这一点 我已经测试了大约一周 终于得出了答案 知道这也可能是我在 Windows 机器上运行 PhantomJS
  • 如何在python3中安装COCO PythonAPI

    看来COCO PythonAPI仅支持python2 但人们确实在 python3 环境中使用它 我尝试了可能的方法来安装它 例如 python3 setup py build ext inplace python3 setup py in
  • 是否可以使用jQuery读取meta标签

    是否可以使用 jQuery 读取元标记 如果是这样 您知道代码的基本结构是什么 或者有任何教程的链接 只需使用类似的东西 var author meta name author attr content 或这个也是如此 var author
  • JSF 中的 CSRF、XSS 和 SQL 注入攻击预防

    我有一个基于 JSF 构建的 Web 应用程序 并使用 MySQL 作为数据库 我已经在我的应用程序中实现了防止 CSRF 的代码 现在由于我的底层框架是 JSF 我想我不必处理 XSS 攻击 因为它已经由UIComponent 我没有在任
  • IE7 和 IE8 中的框阴影

    我想在 IE7 和 IE8 中实现框阴影 我已经尝试了一切但没有成功 这是我用来将彩色阴影应用于 div 的 css bright position absolute z index 1 moz box shadow 0px 3px 55p
  • 在 Spark SQL 中查找多个双数据类型列的中位数

    我需要找到多个双数据类型列的中位数 请求建议以找到正确的方法 下面是我的示例数据集 其中有一列 我期望我的样本的中值返回为 1 scala gt sqlContext sql select num from test show num 0
  • 为什么 Spark 会为一项操作创建多个作业?

    我注意到 当仅使用一个操作启动这堆代码时 我启动了三个作业 from typing import List from pyspark sql import DataFrame from pyspark sql types import St
  • Bookmarklet:将隐藏的 iframe 附加到页面并加载 url

    我有一个用于重置路由器的书签 我只需要访问并让页面完成加载 然后我的路由器开始重置 javascript function w window open http 192 168 0 1 goform formReboot width 1 h
  • 使用.NET / WMI获取PC的显示器信息

    是否有使用 WMI Net 来获取显示器信息 例如制造商 序列号 显示器尺寸等 使用脚本也是一种选择 或者我可以直接查询注册表来获取此信息吗 SELECT FROM Win32 DesktopMonitor在这种情况下 并没有真正为我返回任
  • 正则表达式用于检测同一字符五次以上?

    我想弄清楚如何编写一个正则表达式来检测字符串中是否有任何字符连续重复超过五次 例如 它不会检测 hello 但会检测 hellooooooooooo 有任何想法吗 Edit 抱歉 澄清一下 我需要它来检测same字符重复超过五次 而不是任何
  • 防止 pandas 垂直和水平连接我的数据帧

    我正在尝试水平连接两个数据帧 df2每个观测值包含 2 个结果变量df1 df1 shape 242583 172 df2 shape 242583 2 我的代码是 Fin pd concat df1 df2 axis 1 但不知何故 结果
  • 未捕获的类型错误:无法将属性“onclick”设置为空[重复]

    这个问题在这里已经有答案了 我正在创建一个 HTML 页面 它是使用 bootstrap 构建的 下面是最终的 HTML 代码和 hello js 文件的代码 document getElementById subm onclick fun
  • 如何实现“编辑”菜单的“撤消”、“剪切”、“粘贴”和“复制”功能?

    问候 对于我的一个应用程序 我正在尝试实现一个 编辑 菜单 该菜单通常有标准条目Undo Cut Copy and Paste 默认情况下不存在此菜单 用户似乎期望它尤其是在 Mac OS X 上 有没有一种更简单的方法来实现这一点 而无需
  • 发布带有不安全代码的 Web 应用程序

    我正在尝试发布一个 Web 应用程序 使用 VS2012 Web 我需要在其中运行 vb 脚本 该脚本当前无法正确运行 可能是因为缺乏权限 我目前正在尝试以用户身份运行它并提供一些凭据 我必须提供的密码必须位于System Security
  • 在 C 中“声明”字符串的最佳方法

    我是 C 世界的新手 来自 PHP 我正在玩字符串 我知道没有这种类型的数据 我的问题是 声明 字符串的最佳方式是什么 经过一些研究 我得出了这一点 char str 40 Here is my text char str Here is
  • C++ 中的 Mixins、可变参数模板和 CRTP

    场景如下 我想要一个可以有可变数量的 mixin 的主机类 对于可变参数模板来说并不是太难 例如参见http citeseerx ist psu edu viewdoc summary doi 10 1 1 103 144 但是 我还希望
  • IllegalStateException:适配器的内容已更改但ListView未收到通知

    我使用自定义 ArrayAdapter 在 AutocompleteTextView 上设置适配器 AddressAdapter 扩展 ArrayAdapter public class AutoCompleteAdapter extend