2017-08-02 3 views
0

検索結果をフィルタリングするためのカスタムアダプタがあります。これは、自動補完検索タグを見つけるのにうまく機能します。ただし、ユーザーが最初に検索テキストビューに触れると、最近検索されたアイテムが表示されるように変更されています。次のようにFilterableを実装しているAndroidアダプタには結果が表示されません

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.OnTouchListener onTouchListener = new View.OnTouchListener() 
    { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) 
     { 
      searchTextView.setText(""); 
      recentSearches = true; 

      return false; 
     } 
    }; 

もTextwatcherあり:フィルタリング処理は、検索のTextViewのテキストを "" に設定することにより開始される

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

SearchAdapterは次のとおりです。

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メソッドが1回だけ呼び出され、結果は表示されません。対照的に、オートコンプリート項目は、数文字で入力すると期待通りに表示されます。最近の検索はnullではなく、テキストの変更の前後に searchTextView.getAdapter().getCount()を呼び出すと、正しい検索回数が返されます。

なぜ結果が表示されないのですか?何か案は?

おかげ

答えて

0

手動で我々はのEditTextのontouch(action_down)の内側とその中のテキストが長さゼロを持つ場合

onSearchSuggestionTextChanged.onTextChanged() 

を呼び出す必要があります!これにより、次にフィルタのすべてのイベントを発生さでしょう

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; 
    } 
}; 
関連する問題