2017-08-02 62 views
0

我有一个用于筛选搜索结果的自定义适配器。这适用于查找自动完成搜索标签。但是,它已被修改为在用户第一次触摸搜索文本视图时显示最近搜索的项目。实现Filterable的Android适配器不显示结果

TextView.OnTouchListener onTouchListener = new View.OnTouchListener() 
    { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) 
     { 
      searchTextView.setText(""); 
      recentSearches = true; 

      return false; 
     } 
    }; 

还有一个Textwatcher:

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

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) 
     { 
      if (s.length() > 0) 
      { 
      recentSearches = false; 
      } 
     } 

     @Override 
     public void afterTextChanged(Editable s) 
     { 
      if (!recentSearches && s.length() == 0) 
      { 
       cancelSearch(); 
      } 
     } 
    }; 

搜索的TextView如下初始化:过滤处理通过设置文本为 “”,在搜索的TextView发起

searchTextView.setAdapter(new SearchAdapter(this)); 
searchTextView.addTextChangedListener(onSearchSuggestionTextChanged); 
searchTextView.setOnTouchListener(onTouchListener); 

而搜索适配器是:

public class SearchAdapter extends BaseAdapter implements Filterable 
{ 
    private Context context; 
    private List<FoundItem> resultList = new ArrayList<FoundItem>(); 
    private List<FoundItem> recentSearches = null; 

    public SearchAdapter(Context context) 
    { 
     this.context = context; 
    } 

    @Override 
    public int getCount() 
    { 
     return resultList.size(); 
    } 

    @Override 
    public FoundItem getItem(int index) 
    { 
     return resultList.get(index); 
    } 

    @Override 
    public long getItemId(int position) 
    { 
     return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) 
    { 
     if (convertView == null) 
     { 
      LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = inflater.inflate(R.layout.simple_dropdown_item, parent, false); 
     } 

     FoundItem item = getItem(position); 
     ((TextView) convertView.findViewById(R.id.text)).setText(item.name()); 

     return convertView; 
    } 

    @Override 
    public Filter getFilter() 
    { 
     Filter filter = new Filter() 
     { 
      @Override 
      protected FilterResults performFiltering(CharSequence constraint) 
      { 
       FilterResults filterResults = new FilterResults(); 
       if (constraint != null) 
       { 
        List<FoundItem> items = findSuggestions(context, constraint.toString()); 

        // Assign the data to the FilterResults 
        filterResults.values = items; 
        filterResults.count = items.size(); 
       } 
       else 
       { 
        filterResults.values = getRecentSearches(); 
        filterResults.count = getRecentSearches().size(); 
       } 
       return filterResults; 
      } 

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

    private List<FoundItem> findSuggestions(Context context, String query) 
    { 
     ... 
     return foundItems; 
    } 

    private List<FoundItem> getRecentSearches() 
    { 
     ... 
     return recentSearches; 
    } 

适配器确实会得到最近搜索的结果,所以performFilteringpublishResults方法按预期调用,但只调用一次getCount方法,并且不显示任何结果。相比之下,当输入几个字符时,自动完成项目按预期显示。请注意,最近的搜索不为空,并且在文本更改前后调用 searchTextView.getAdapter().getCount()时,会返回以前搜索的正确数目。

那为什么不显示结果呢?有任何想法吗?

感谢

回答

0

手动我们也必须调用

onSearchSuggestionTextChanged.onTextChanged() 

的EditText上的ontouch(ACTION_DOWN)内,如果它的文本长度也为零!

这将inturn消防过滤器的所有事件

TextView.OnTouchListener onTouchListener = new View.OnTouchListener() 
{ 
    @Override 
    public boolean onTouch(View v, MotionEvent event) 
    { 
     searchTextView.setText(""); 
     recentSearches = true; 
     onSearchSuggestionTextChanged.onTextChanged("",0,0,0); 
     return false; 
    } 
};