在我的应用程序中,我有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())”的内容,然后一切正常。
最后这段代码工作了好几天......我很困惑。任何人都可以解释发生了什么吗?) 提前谢谢!
答案 0 :(得分:0)
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();
}
}