2012-04-03 55 views
1

我有列表視圖及其適配器存儲爲全局變量。我不通過擴展ListActivity來創建我的列表。我的代碼如下:在列表中搜索不能在Android中工作

public void onCreate(Bundle...) { 
    mListView = (ListView) findViewById(R.id.listview1); 
    //setting my custom array adapter...works fine. 
    //also my custom adapter implements Filterable interface 
    mListView.setAdapter(...) 
    mListView.setTextFilterEnabled(true); 

    //My edit text where I enter my query 
    mSearchEditText = (EditText) findViewById(R.id.searchEditText); 
    mSearchEditText.addTextChangedLIstener(myListener); 
} 

private TextWatcher myListener = new TextWatcher() { 

    public void onTextChanged(CharSequence s, int start, int before, int count) { 
     if (s == null || s.length() == 0) { 
      mListView.clearTextFilter(); 
     } 
     else { 
      mListView.setFilterText(s.toString()); 
     } 
    } 
    ... 
    ... 
} 

我的問題是,當我在編輯文本輸入我的字符串,它給我糾正沒有可用的搜索項目(僅數)在我的列表中,但不是項目本身。

例如,如果我的列表中有項目AA,BB,CC,DD,FF,EE,EE

所以,如果我搜索EE,我的結果將是AA,BB而不是ee,ee。如果我搜索cc,我的過濾器列表將只顯示aa

任何人都可以幫助我嗎?

回答

4

我有一個工作示例,試試這個:

filterEditText = (EditText)findViewById(R.id.filter); 
filterEditText.addTextChangedListener(filterTextWatcher); 

TextWatcher filterTextWatcher = new TextWatcher() { 

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

     } 
     public void onTextChanged(CharSequence s, int start, int before,int count) { 
      adapter.getFilter().filter(s); 
     } 

     @Override 
     public void afterTextChanged(Editable s) { 
      // TODO Auto-generated method stub    
     } 
    }; 

適配器必須implements Filterable

  @Override 
      public Filter getFilter() { 
//    Filter filter = null; 

       if(filter == null) 
        filter = new CheeseFilter(); 
       return filter; 
      } 

和過濾器類:

 public class CheeseFilter extends Filter { 

      @Override 
      protected FilterResults performFiltering(CharSequence constraint) { 
       // TODO Auto-generated method stub 

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

       FilterResults newFilterResults = new FilterResults(); 

       if (constraint != null && constraint.length() > 0) { 


        ArrayList<String> auxData = new ArrayList<String>(); 

        for (int i = 0; i < data.size(); i++) { 
         if (data.get(i).toLowerCase().contains(constraint)) 
          auxData.add(data.get(i)); 
        } 

        newFilterResults.count = auxData.size(); 
        newFilterResults.values = auxData; 
       } else { 

        newFilterResults.count = data.size(); 
        newFilterResults.values = data; 
       } 

       return newFilterResults; 
      } 

      @Override 
      protected void publishResults(CharSequence constraint, FilterResults results) { 

       ArrayList<String> resultData = new ArrayList<String>(); 

       resultData = (ArrayList<String>) results.values; 

       EfficientAdapter adapter = new EfficientAdapter(context, resultData); 
       list.setAdapter(adapter); 

//    notifyDataSetChanged(); 
      } 

     } 

您可以查看這篇文章的詳細信息:

Filter expandableList

Filter ListView

+0

我正在處理它。完成後會回覆你。 – AndroDev 2012-04-04 08:46:26

+0

賓果...工作。謝謝哥們。 – AndroDev 2012-04-04 09:41:13

+0

不客氣:) – Chronos 2012-04-04 13:01:45

0

你需要將它設置在適配器上而不是直接在列表視圖中。 因此,保持你的列表視圖設置適配器的參考,並嘗試在你的文字變化監聽器是這樣的:

private TextWatcher myListener = new TextWatcher() 
{ 

    public void onTextChanged(CharSequence s, int start, int before, int count) 
    { 
     myadapter.getFilter().filter(s); 
    } 
    ... 
    ... 
} 
+0

我已經嘗試過這一點,但它有兩個問題: 1.同我上面提到的。 2.另外,當我從編輯文本中清除我的文本時,我的列表視圖看不到完整。 – AndroDev 2012-04-03 13:20:17

+0

嗯,我想你可以試試這個。這是以舊式的方式:http://androidsearchfilterlistview.blogspot.co.uk/ – 2012-04-03 14:14:02