AutoCompleteTextView - отключить фильтрацию

Я извлекаю список строк из webservice, и я хочу перечислить их на AutoCompleteTextField независимо от встроенных фильтров AutoCompleteTextField.

Как мне это сделать? существует ли способ легко отключить внутреннюю фильтрацию (желательно без подкласса) Я загрузил все мои результаты в ArrayAdapter, проблема в том, что некоторые из них не отображаются из-за фильтрации.

Если я пойду в неправильном направлении, пожалуйста, укажите мне в правильном направлении.

Ответ 1

В конце концов я подклассифицировал ArrayAdapter, отключил фильтры методом Overriding it getFilter и сделал мой HTTPRequest во время событий с измененным текстом.

Ответ 2

Вероятно, @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();
        }
    }
}

Надеюсь, это поможет.

Ответ 3

Я решил свою проблему, создав собственный адаптер, расширяющий класс 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) {

            }
        };
    }
}