不止一个人遇到过如何为使用 SimpleCursorAdapter 的 ListView 实现 Filter 的问题。我遇到了这个问题,我在这个网站上找到了很多关于这个的答案。我从任何地方获取了一些代码,直到我终于让它工作,它看起来更简单。
我在 youtube 上看过 Google I/O 2010 - The world of ListView 视频,它说您必须实现 getFilter 方法并在您的类适配器上实现 Filterable,如下所示:
public class MyListCursorAdapter extends SimpleCursorAdapter implements Filterable{
...
@Override
public Filter getFilter() {
return new Filter(){
@Override
protected FilterResults performFiltering(CharSequence charSequence){
FilterResults results = new FilterResults();
//If there's nothing to filter on, return the original data for your list
if(charSequence == null || charSequence.length() == 0){
results.values = originalData;
results.count = originalData.getCount();
}
else{
Cursor filterResultsData = null;
filterResultsData = DB.getResults(charSequence);
results.values = filterResultsData;
results.count = filterResultsData.getCount();
}
return results;
}
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults){
filteredData = (Cursor) filterResults.values;
if (filterResults.count > 0) {
notifyDataSetChanged();
}else{
notifyDataSetInvalidated();
}
}
};
}
}
至少这是我试图做的。我已经看到使用 ArrayAdapter 而不是 Cursor 效果很好。但是在 Cursor 的情况下它不起作用,至少对我来说不起作用。也许我做错了什么。所以我有点困惑做什么。我知道我有一个编辑文本、一个列表视图,每次在我的编辑文本上放一些文本时,我都希望我的列表被过滤。
现在我要回答我自己的问题,因为我想与您分享我的解决方案。