Android Custom autocompletetextview зависает при нажатии на клавишу Backspace

Я использую автозаполнение текста с настраиваемым адаптером в android. работает нормально. Но когда я нажимаю Backspace, чтобы очистить выбранный элемент из автозаполнения текста, он зависает или происходит задержка при удалении. Как я могу это преодолеть? Коды моих фильтров приведены ниже

 @Override
    protected FilterResults performFiltering(CharSequence constraint) {
        if (constraint != null) {
            suggestions.clear();
            FilterResults filterResults = new FilterResults();
            for (Names people : tempItems) {


  if(people.getName().toLowerCase().contains(constraint.toString()
  .toLowerCase())) {
                    suggestions.add(people);
                }
            }
       //     FilterResults filterResults = new FilterResults();
            filterResults.values = suggestions;
            filterResults.count = suggestions.size();
            return filterResults;
        } else {
            return new FilterResults();
        }
    }

    @Override
    protected void publishResults(CharSequence constraint, FilterResults 
  results) {
        List<Names> filterList = (ArrayList<Names>) results.values;
        if (results != null && results.count > 0) {
            clear();
            for (Names people : filterList) {
                add(people);
                notifyDataSetChanged();
            }
        }
    }
};

Что я делаю неправильно ? Заранее спасибо.


person Hari    schedule 10.04.2017    source источник


Ответы (1)


Измените фильтр в соответствии с приведенным ниже кодом. Вы уведомляете адаптер внутри цикла, он должен быть уведомлен, как только весь список будет добавлен в другой список, то есть вне цикла.

// Это весь мой адаптер, он работает как шарм и об обновлении в потоке пользовательского интерфейса, да, я уведомляю адаптер в потоке пользовательского интерфейса.

   public class SuburbSuggestionsAdapter extends ArrayAdapter<String> implements Filterable {

    protected static final String TAG = "SuggestionAdapter";
    private List<String> suggestions;
    private Context context;
    private List<String> SuburbList = new ArrayList<>();

    public SuburbSuggestionsAdapter(Context context) {
        super(context, android.R.layout.simple_dropdown_item_1line);
        suggestions = new ArrayList<String>();
        this.context = context;
    }

    @Override
    public int getCount() {
        return (null != suggestions ? suggestions.size() : 0);
    }

    @Override
    public String getItem(int index) {
        return suggestions.get(index);
    }

    @Override
    public Filter getFilter() {
        Filter myFilter = new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                FilterResults filterResults = new FilterResults();

                if(!TextUtils.isEmpty(constraint)){
                    WebServiceHandler.hitFetchSuburbList(context, constraint.toString(), new CallbackRest() {
                        @Override
                        public void onDone(String response) {
                            if(SuburbList.size()!=0){
                                SuburbList.clear();
                            }
                            try {
                                JSONArray jsonArray = new JSONArray(response);
                                for(int i=0; i<jsonArray.length(); i++){
                                    SuburbList.add(jsonArray.get(i).toString());
                                }

                            } catch (JSONException e) {
                                e.printStackTrace();
                            }

                        }
                    });
                    // A class that queries a web API, parses the data and
                    // returns an ArrayList<GoEuroGetSet>
                    List<String> new_suggestions = SuburbList;
                    suggestions.clear();
                    for (int i=0;i<new_suggestions.size();i++) {
                        suggestions.add(new_suggestions.get(i));
                    }

                    // Now assign the values and count to the FilterResults
                    filterResults.values = suggestions;
                    filterResults.count = suggestions.size();
                }
                return filterResults;
            }

            @Override
            protected void publishResults(CharSequence contraint,   FilterResults results) {
                if (results != null && results.count > 0) {
                    notifyDataSetChanged();
                } else {
                    notifyDataSetInvalidated();
                }
            }
        };
        return myFilter;
    }

}
person Simranjeet Singh    schedule 10.04.2017
comment
1. что такое SuburbList. 2. вы ничего не делаете с resutls.values внутри publishResults ... бесполезно - person Selvin; 10.04.2017
comment
Я сделал то же самое, что и вы, внутри метода publishResults в методе getFilter (). Пожалуйста, попробуйте прочитать весь код, прежде чем отмечать его как отрицательный. - person Simranjeet Singh; 10.04.2017
comment
Я сделал то же самое, что и вы НЕ МЕНЯ внутри publishResults в методе getFilter () ужасная идея, это должно быть сделано снова в потоке пользовательского интерфейса ... Пожалуйста, попробуйте прочитать весь код, прежде чем отмечать его как отрицательный. прочтите комментарий ... его нельзя использовать, потому что нет SuburbList внутри исходного кода. - person Selvin; 10.04.2017
comment
Я предоставил вам свою реализацию кода, которую я использовал. Вам просто нужно проанализировать код и внести в него изменения. Говоря о ужасной идее, я имею в виду, кто уведомляет адаптер после добавления каждого элемента в список в цикле, я действительно имею в виду! - person Simranjeet Singh; 10.04.2017
comment
Если у вас есть лучший ответ, почему бы не опубликовать здесь ... Я имею в виду, что это место, где можно вернуть что-то сообществу, а не просто троллить людей и дурачиться! - person Simranjeet Singh; 10.04.2017
comment
Теперь еще хуже performFiltering делается в потоке без пользовательского интерфейса, вы вызываете WebServiceHandler.hitFetchSuburbList, который кажется асинхронным внутри ... это означает, что приложение попадает в publishResults раньше onDone ... вот как создаются плохие программы - person Selvin; 10.04.2017
comment
Тогда почему бы вам не поделиться своим ЛУЧШИМ РЕШЕНИЕМ, чтобы каждый мог узнать оттуда кое-что. - person Simranjeet Singh; 10.04.2017
comment
Очевидно, потому что вопрос неясен, fx: мы не знаем, что такое базовый класс для пользовательского адаптера ... но вернемся к вашему образцу ... нет необходимости расширять ArrayAdapter, если вы переопределяете почти все методы, которые он предоставляет, очевидно, BaseAdapter это лучший выбор - person Selvin; 10.04.2017
comment
Я поделился с вами своим кодом, и вы можете предложить свое решение на его основе. Кроме того, я не думаю, что вопрос может быть более ясным, чем этот. - person Simranjeet Singh; 10.04.2017
comment
Я поделился с вами кодом и сказал, что это плохой код ... Я имею право так думать ... вы можете предоставить свое решение на основе этого нет ... Я бы предпочел (если бы у меня было время) предоставить код, основанный на вопросе ... но это неясно ... Кроме того, я не думаю, что вопрос может быть более ясным, чем этот вы ошибаются, это может быть более понятно ... Он может содержать весь код его пользовательского адаптера - person Selvin; 10.04.2017
comment
Вы поделились своим мнением о моем коде и коде другого человека и ничего больше. Мы с этим человеком реализовали autoCompleteTextView с помощью customAdapter для фильтрации данных в реальном времени из webService, и код приведен выше, чтобы все могли увидеть и предоставить лучшее решение. Я дал ему свою версию решения. Вместо того, чтобы просто отмечать вопрос или ответ, почему бы вам также не поделиться своим кодом, может быть какое-то руководство, а не просто представления, чтобы другие могли учиться на нем. - person Simranjeet Singh; 10.04.2017