2017-08-02 3 views
0

J'ai un adaptateur personnalisé qui est utilisé pour filtrer les résultats de la recherche. Cela fonctionne très bien pour trouver des balises de recherche auto-complétées. Toutefois, il a été modifié pour afficher les éléments récemment recherchés lorsque l'utilisateur touche pour la première fois l'affichage du texte de recherche. Le processus de filtrage est initié en définissant le texte "" dans la recherche textView:L'adaptateur Android qui implémente Filterable n'affiche pas les résultats

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

      return false; 
     } 
    }; 

Il y a aussi un 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(); 
      } 
     } 
    }; 

La recherche textView est initialisés comme suit:

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

Et le SearchAdapter est:

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; 
    } 

L'adaptateur obtient des résultats pour les recherches récentes. Les méthodes performFiltering et publishResults sont appelées comme prévu, mais seule la méthode getCount est appelée une fois et aucun résultat n'est affiché. En revanche, les éléments de saisie semi-automatique sont affichés comme prévu lors de la saisie de quelques caractères. Notez que les recherches récentes ne sont pas nulles et lorsque vous appelez searchTextView.getAdapter().getCount() avant et après le changement de texte, le nombre correct de recherches précédentes est renvoyé.

Alors pourquoi ne pas afficher les résultats? Des idées?

Merci

Répondre

0

nous ne devons appeler manuellement

onSearchSuggestionTextChanged.onTextChanged() 

à l'intérieur du OnTouch (action_down) du edittext et si le texte en elle a une longueur zéro!

qui tireraient à leur tour tous les événements du filtre

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; 
    } 
};