我正在进行ListView
过滤。这是我的需求:
ListView
获取所有项目。ListView
过滤井时。问题是当我从搜索中逐字逐句删除时,我没有过滤,因为我填充了原始ListView
的结果。这里的问题很明显。但是当我删除我的原始ListView
被过滤和显示的单词时,不知道如何解决它。
这是发布结果方法:
protected void publishResults(CharSequence constraint, FilterResults results) {
if (constraint.length()>0 &&results.count == 0) {
_1History =(ArrayList<HistoryModel>) results.values;
notifyDataSetChanged();
} else if(constraint.length()==0){
_1History = _1HistoryOriginalData;
notifyDataSetChanged();
} else {
_1History = (ArrayList<HistoryModel>) results.values;
notifyDataSetChanged();
}
}
答案 0 :(得分:1)
该帖子不是最近的,但它确实出现在谷歌搜索,所以我会尝试它。
我认为您遇到的问题是,一旦按下退格键,过滤器结果就不会更新?我不能真正看到问题的根源,因为只显示了publishResults方法,因此我将假设这一点。
当你开始在搜索字段中输入时,_1History数组开始过滤,缩短每个字符后数组的大小。
_1History =(ArrayList<HistoryModel>) results.values;
表示每个连续搜索查询(添加或删除字符)仅在已过滤的_1History数组中搜索。
问题及其解决方案在performFiltering方法中。问题是你有一个循环搜索_1History数组中的每个项目,并从该数组中删除不包含约束的所有对象。唯一的好处是,在_1History数组缩短之后,循环被访问的次数减少了,这可能是我认为有益的性能。
相反,您应该搜索包含所有对象的_1HistoryOriginalData数组,而不仅仅是最近过滤的对象。
或者,如果您希望在每次方法调用后继续过滤_1History并删除对象,以便最小化循环。您可以在performFiltering方法的顶部添加一段代码,用于检查字符是否已被删除,然后仅重置_1History以包含所有对象。这可能需要一个全局变量。以下是如何执行此操作的示例:
if(previousLength > constraint.length()){
_1History.clear();
_1History.addAll(_1HistoryOriginalData);
previousLength = constraint.length();
}else{
previousLength = constraint.length();
}
previousLength是一个全局变量。