2015-10-06 105 views
0

這是我的應用程序所做的,用戶可以通過搜索框進行搜索。當他鍵入內容並匹配時,它會過濾gridview。但是當他試圖刪除時,沒有記錄顯示。 清空搜索框時,我被困在顯示整個記錄。Android GridView不在空搜索框中顯示記錄

這是我已經試過:

MainActivity.class:

etSearch.addTextChangedListener(new TextWatcher() { 

     @Override 
     public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) { 
       adapter.getFilter().filter(cs.toString()); 


     } 

     @Override 
     public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { 

     } 

     @Override 
     public void afterTextChanged(Editable cs) { 

     } 
    }); 

CustomAdapter.class:

@Override 
public Filter getFilter() { 
    if (starsFilter == null) 
     starsFilter = new StarsFilter(); 
    return starsFilter; 
} 

private class StarsFilter extends Filter { 

    @Override 
    protected FilterResults performFiltering(CharSequence constraint) { 
     // Create a FilterResults object 
     FilterResults results = new FilterResults(); 

     constraint = constraint.toString().toLowerCase(); 

     if (constraint != null && constraint.toString().length() > 0) { 
      ArrayList<HashMap<String, String>> filteredStars = new ArrayList<>(); 
      for(HashMap<String, String> item : data){ 
       if(item.toString().toLowerCase().contains(constraint)){ 
        filteredStars.add(item); 
       } 
      } 
      results.values = filteredStars; 
      results.count = filteredStars.size(); 
     } else { 
      synchronized(this) { 
       results.values = data; 
       results.count = data.size(); 
      } 
     } 

     // Return our FilterResults object 
     return results; 
    } 

    @Override 
    protected void publishResults(CharSequence constraint, FilterResults results) { 
     data.clear(); 

     if (constraint.length() == 0) { 
      notifyDataSetInvalidated(); 
     } else { 
      for (HashMap<String, String> result : (ArrayList<HashMap<String, String>>) results.values) { 
       data.add(result); 
      } 
      notifyDataSetChanged(); 
     } 

    } 


} 

任何想法?我會很感激你的幫助。提前致謝!

+1

問題是什麼?這個問題並不清楚。 – Lingviston

+0

你真的想要做什麼,你在哪裏阻止 – Sree

+0

@Lingviston我已更新我的帖子 –

回答

0

首先不要用單個的ArrayList調用data來存儲初始結果和過濾結果。請注意,在發佈結果中,您首先會清除data,因此一旦用戶使用了搜索 - 原始數據部分/完全丟失。

因此,在您的適配器中有2個ArrayList,例如,其名稱爲originalDatafilteredData。過濾期間不得更改originalData。最初filteredData必須是originalData的副本,並且您的適配器必須始終使用filteredData作爲源數據集。

在執行過濾時,您必須修改/清除/填寫filteredData。如果constraint爲空字符串,則必須將所有originalData內容複製到filteredData

然後在publishResults將支票從constraint.length() == 0更改爲results.count == 0

+0

你可以提供示例代碼?謝謝! –

+0

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.0_r1/android/widget/ArrayAdapter.java默認的ArrayAdapter實現非常相似。主要觀點是2個數據集。也許這個例子太重了,但我想我的解釋可以解決你的問題。 – Lingviston

+0

謝謝你!我會仔細閱讀 –