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