2016-01-31 43 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是一個全局變量。