Android ListView过滤器因NPE而失败

时间:2011-02-09 22:46:13

标签: android listview filter null adapter

在我的应用程序中,我有ListView,适配器和适配器过滤器。这是过滤器:

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突然运行时,我的Adapter的字段“filteredContacts”设置为NULL。

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

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

1 个答案:

答案 0 :(得分:0)

好的伙计们!我知道了! 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();
    }
}