2012-04-03 80 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