Listview过滤器 - 在退格上过滤(删除)

时间:2016-01-31 18:56:24

标签: android listview

我正在进行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();
                }
            }

1 个答案:

答案 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是一个全局变量。