2016-01-31 32 views
0

我正在工作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

你什么时候调用'publishResult'方法? – Seyyed

回答

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