2013-08-07 57 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

人们可以通过阅读来理解它,但实现过程如何! –