В настоящее время я собираюсь реализовать собственный адаптер массива для SearchView
внутри моего приложения.Я собираюсь вернуть автозаполнение с удаленного сервера, поэтому я попытался реализовать свой пользовательский фильтр.
Проблема в моем пользовательском фильтре performFiltering
вызывается, однако publishResults
никогда не вызывается и списоквсе элементы адаптера массива возвращаются без применения фильтрации.
Мой код приведен ниже, и если он работает правильно, он должен показать 3 фиксированных элемента после фильтрации, которые ttt , xyz , test но, как я объяснил, этого не происходит, и item является элементом массива без каких-либо изменений и фильтрации.
SearchArrayAdapter
class SearchArrayAdapter extends ArrayAdapter<String> implements Filterable {
public SearchArrayAdapter(@NonNull Context context, int resource) {
super(context, resource);
}
public SearchArrayAdapter(@NonNull Context context, int resource, int textViewResourceId) {
super(context, resource, textViewResourceId);
}
public SearchArrayAdapter(@NonNull Context context, int resource, @NonNull String[] objects) {
super(context, resource, objects);
}
public SearchArrayAdapter(@NonNull Context context, int resource, int textViewResourceId, @NonNull String[] objects) {
super(context, resource, textViewResourceId, objects);
}
public SearchArrayAdapter(@NonNull Context context, int resource, @NonNull List<String> objects) {
super(context, resource, objects);
}
public SearchArrayAdapter(@NonNull Context context, int resource, int textViewResourceId, @NonNull List<String> objects) {
super(context, resource, textViewResourceId, objects);
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
View view = super.getView(position, convertView, parent);
Log.v("MY_TAG", "Adapter Item:" + getItem(position));
view.setTag(getItem(position));
return view;
}
@NonNull
@Override
public Filter getFilter() {
Filter myFilter = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults filterResults = new FilterResults();
ArrayList<String> x = new ArrayList<>();
String[] arrayofString = (new String[]{"ttt", "xyz", "test"});
Collections.addAll(x, arrayofString);
filterResults.values = x;
filterResults.count = 3;
return filterResults;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
if (results != null && results.count > 0) {
notifyDataSetChanged();
} else {
notifyDataSetInvalidated();
}
}
};
return myFilter;
}
}
Внутри моего фрагмента:
SearchArrayAdapter adapter = new SearchArrayAdapter(getActivity(), android.R.layout.simple_list_item_1, searchItems);
mSearchAutoComplete.setAdapter(adapter);
mSearchAutoComplete.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Log.v("MY_TAG", "Adapter Position: " + position);
Log.v("MY_TAG", "Adapter String: " + searchItems[position]);
Log.v("MY_TAG", "Adapter TAG: " + view.getTag());
searchView.setQuery((String) view.getTag(), true);
}
});
searchView.setOnSuggestionListener(new SearchView.OnSuggestionListener() {
@Override
public boolean onSuggestionSelect(int position) {
Log.v("MY_TAG", "Item Selected: " + position);
return true;
}