我有工作 ListView
过滤。这是我的需求:
- 当我没有结果时,我会显示空 View 。
- 当我的搜索为空时 -
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();
}
}
最佳答案
该帖子不是最新的,但它确实出现在谷歌搜索中,所以我会尝试一下。
我假设您遇到的问题是在您按下退格键后过滤结果不会更新?由于只显示了 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 是一个全局变量。
关于android - ListView 过滤器 - 退格过滤(删除),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35117948/