2011-12-23 123 views
1

我有一个问题,当我想从LogCat过滤AutoCompleteTextView中的结果我知道过滤执行正确,但它不刷新视图:/我忘记了一些建议或帮助?AutoCompleteTextView与自定义ArrayAdapter和筛选器

以下是过滤器的源代码。

@Override 
public Filter getFilter() { 
    Filter myFilter = new Filter() { 

     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      Log.i(TAG, "Perform filtering with constraint: " + constraint.toString()); 
      List<String> resultsSuggestions = new ArrayList<String>(); 
      Log.i(TAG, "COUNT: " + getCount()); 
      for (int i = 0; i < getCount(); i++) { 
       if(getItem(i).getSuggestionValue().startsWith(constraint.toString())){ 
        Log.i(TAG, "ADDED"); 
        resultsSuggestions.add(getItem(i).getSuggestionValue()); 
       } 
      } 
      FilterResults results = new FilterResults(); 
      results.values = resultsSuggestions; 
      results.count = resultsSuggestions.size(); 
      return results; 
     } 

     @Override 
     protected void publishResults(CharSequence constraint, FilterResults results) { 
      if (results != null && results.count > 0) { 
       notifyDataSetChanged(); 
      } else { 
       notifyDataSetInvalidated(); 
      } 
     } 
    }; 
    return myFilter; 
} 

回答

2

缺少的部分是,我需要从过滤器设置新的价值观,所以我只是简单地改变了

publushResults(); 

,现在它的工作。正确的代码在下面。

@Override 
    @SuppressWarnings("unchecked") 
    protected void publishResults(CharSequence constraint, FilterResults results) { 
     clear(); 
     ArrayList<Suggestions> newValues = (ArrayList<Suggestions>) results.values; 
     for (int i = 0; i < newValues.size(); i++) { 
      add(newValues.get(i)); 
     } 
     if(results.count>0){ 
      notifyDataSetChanged(); 
     } else{ 
      notifyDataSetInvalidated(); 
     } 
    } 
1

另一个更新 - 在输入和搜索文本框很快删除所有文字崩溃的newValues.size()或newValues.get(i)申请作为newValues可能为空。所以,这里是你应该使用的代码:

@Override 
    @SuppressWarnings("unchecked") 
    protected void publishResults(CharSequence constraint, FilterResults results) { 
     clear(); 
     ArrayList<Suggestions> newValues = (ArrayList<Suggestions>) results.values; 
     if(newValues !=null) { 
      for (int i = 0; i < newValues.size(); i++) { 
       add(newValues.get(i)); 
      } 
      if(results.count>0){ 
       notifyDataSetChanged(); 
      } else{ 
       notifyDataSetInvalidated(); 
     } 
    } 
+0

你能告诉我我和你的代码有什么区别吗? – Robert 2012-02-27 19:48:07

+1

@罗伯特,你的不是抄袭,他是。 – Skyline 2014-07-29 09:06:03

相关问题