Ответ 1
В конце концов я подклассифицировал ArrayAdapter
, отключил фильтры методом Overriding it getFilter
и сделал мой HTTPRequest
во время событий с измененным текстом.
Я извлекаю список строк из webservice
, и я хочу перечислить их на AutoCompleteTextField
независимо от встроенных фильтров AutoCompleteTextField
.
Как мне это сделать? существует ли способ легко отключить внутреннюю фильтрацию (желательно без подкласса)
Я загрузил все мои результаты в ArrayAdapter
, проблема в том, что некоторые из них не отображаются из-за фильтрации.
Если я пойду в неправильном направлении, пожалуйста, укажите мне в правильном направлении.
В конце концов я подклассифицировал ArrayAdapter
, отключил фильтры методом Overriding it getFilter
и сделал мой HTTPRequest
во время событий с измененным текстом.
Вероятно, @Alon означает подклассификацию ArrayAdapter
вместо AutoCompleteTextView
. В методе getFilter()
нужно вернуть настраиваемый фильтр, который вообще не выполняет фильтрацию (в performFiltering()
). Вероятно, производительность может быть проблемой - потому что там порождается. Лучше всего было бы извлечь из TextEdit и реализовать собственное всплывающее окно завершения. Но для меня это слишком много хлопот. Наконец, я сделал что-то следующее, и это работает для меня. Любые отзывы оцениваются.
public class KArrayAdapter<T>
extends ArrayAdapter<T>
{
private Filter filter = new KNoFilter();
public List<T> items;
@Override
public Filter getFilter() {
return filter;
}
public KArrayAdapter(Context context, int textViewResourceId,
List<T> objects) {
super(context, textViewResourceId, objects);
Log.v("Krzys", "Adapter created " + filter);
items = objects;
}
private class KNoFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence arg0) {
FilterResults result = new FilterResults();
result.values = items;
result.count = items.size();
return result;
}
@Override
protected void publishResults(CharSequence arg0, FilterResults arg1) {
notifyDataSetChanged();
}
}
}
Надеюсь, это поможет.
Я решил свою проблему, создав собственный адаптер, расширяющий класс ArrayAdapter
и переопределяющий его метод getFilter()
. При этом список не будет фильтроваться на основе текста, помещенного в TextField, и будут отображаться все элементы.
public class MyAdapter extends ArrayAdapter{
public MyAdapter(@NonNull Context context, int resource) {
super(context, resource);
}
public MyAdapter(@NonNull Context context, int resource, int textViewResourceId) {
super(context, resource, textViewResourceId);
}
public MyAdapter(@NonNull Context context, int resource, @NonNull Object[] objects) {
super(context, resource, objects);
}
public MyAdapter(@NonNull Context context, int resource, int textViewResourceId, @NonNull Object[] objects) {
super(context, resource, textViewResourceId, objects);
}
public MyAdapter(@NonNull Context context, int resource, @NonNull List objects) {
super(context, resource, objects);
}
public MyAdapter(@NonNull Context context, int resource, int textViewResourceId, @NonNull List objects) {
super(context, resource, textViewResourceId, objects);
}
@NonNull
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
return null;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
}
};
}
}