2013-08-07 107 views
1

我試圖將搜索功能添加到具有自定義適配器的ListView。當我在EditText中鍵入某些內容時,它會正確地搜索並顯示結果,但如果我試圖擦除剛剛寫入的內容,它將不會與初始列表一起顯示,它將保留在已經過濾的列表中。 下面是代碼:在ListView中的Android搜索無法正常工作

在MainActivity:

private TextWatcher searchTextWatcher = new TextWatcher() { 
    @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count)  { 
       adapter.getFilter().filter(s.toString()); 
       adapter.notifyDataSetChanged(); 
     } 

     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int  after) { 
     } 

     @Override 
     public void afterTextChanged(Editable s) { 
     } 
    }; 

在LazyAdapter:

public Filter getFilter() { 
    return new Filter() { 
     @SuppressWarnings("unchecked") 
     @Override 
     protected void publishResults(CharSequence constraint, FilterResults results) { 
      data = (ArrayList<HashMap<String, String>>) results.values; 
      LazyAdapter.this.notifyDataSetChanged(); 
     } 

     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      ArrayList<HashMap<String, String>> filteredResults = getFilteredResults(constraint); 

      FilterResults results = new FilterResults(); 
      results.values = filteredResults; 

      return results; 
     } 
    }; 
} 

protected ArrayList<HashMap<String, String>> getFilteredResults(
     CharSequence constraint) { 
    ArrayList<HashMap<String, String>> filteredTeams = new ArrayList<HashMap<String, String>>(); 
    for(int i=0;i< data.size();i++){ 
     if(data.get(i).get(MainActivity.KEY_TITLE).toLowerCase().startsWith(constraint.toString().toLowerCase())){ 
      filteredTeams.add(data.get(i)); 
     } 
    } 

    return filteredTeams; 
} 

什麼是錯我的代碼? 謝謝!

+1

http://stackoverflow.com/questions/13090046/how-to-implement-search-in-customlistview-based-on-class-item-of-pojo-class-in-a。檢查這是否有幫助 – Raghunandan

回答

4

意識到,當您篩選與過濾結果替換你的ArrayList您的篩選結果。當你點擊退格刪除字符時,你現在要根據已經過濾的列表進行過濾,這就是爲什麼你的結果不會改變。您需要保留對原始數據集的引用,該數據集沒有應用任何過濾器,並始終使用該過濾器進行過濾,但不會更改/替換過濾器。

+1

謝謝!我終於設法讓它工作(通過製作該ArrayList的副本並始終使用它進行篩選)。 – ionutzm05

+0

人們可以通過閱讀來理解它,但實現過程如何! –