【问题标题】:Android ListView filter fail with NPEAndroid ListView 过滤器因 NPE 而失败
【发布时间】:2011-02-09 22:46:13
【问题描述】:

在我的应用程序中,我有 ListView、Adapter 和 Filter for Adapter。这是过滤器:

private Filter nameFilter = new Filter() {

    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {
        List<Contact> resultContacts = (List<Contact>) results.values;
        filteredContacts = resultContacts;
        notifyDataSetChanged();
    }

    @Override
    protected FilterResults performFiltering(CharSequence constraint) {
        List<Contact> filteredContacts = new ArrayList<Contact>();
        for(Contact c : rawContacts){
            if(!c.getName().toLowerCase().contains(constraint.toString().toLowerCase())){
                continue;
            }
            filteredContacts.add(c);
        }

        FilterResults filterResults = new FilterResults();
        filterResults.values = filteredContacts;
        return filterResults;
    }
};

我是否正确理解在 performFiltering 完成工作后总是调用 publishResults?甚至这份工作也很难而且很长?我有一种情况,publishResults 突然运行,当然我的适配器的字段“filteredContacts”设置为 NULL。

我试图简化 performFiltering 的工作(通过删除循环并编写类似“filteredContacts.add(new Contact())”之类的内容),然后一切正常。

最后几天这段代码运行良好......我很困惑。任何人都可以解释发生了什么吗?) 提前致谢!

【问题讨论】:

    标签: android listview filter null adapter


    【解决方案1】:

    好吧,伙计们!我知道了! performFiltering(...) 在工作线程中运行,当

    if(!c.getName().toLowerCase().contains(constraint.toString().toLowerCase())){
                continue;
    }
    

    在 c.getName().toLowerCase() 上出现 NullPointerException 失败(因为 getName() 返回 null),它的线程也失败了,但似乎 sdk 某处捕获了这个异常,线程就死了。

    此外,UI 线程可以随时调用 publishResults,因此需要进行空值检查:

    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {
        if(results.values != null) {
           List<Contact> resultContacts = (List<Contact>) results.values;
           filteredContacts = resultContacts;
           notifyDataSetChanged();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-14
      • 2020-11-15
      • 2017-08-24
      • 2018-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多