SearchView onQueryTextSubmit выполняется дважды, пока я нажал один раз

Я пишу функцию поиска для доступа к веб-сайту библиотеки. И когда строка запроса отправляется, программа запускает новый поток для анализа информации в Интернете.  он работает нормально на AVD, но мой HTC DesireHD неоднократно показывал результаты поиска (если реальные результаты равны 1. 2. 3. это выглядит как 1. 2. 3. 1. 2. 3.).  Я установил точки останова в методе onQueryTextSubmit, обнаружил, что коды в методе onQueryTextSubmit() выполнялись дважды. и вот мой код:

sv.setOnQueryTextListener(new OnQueryTextListener(){

        @Override
        public boolean onQueryTextChange(String newText) {
            return false;
        }

        @Override
        public boolean onQueryTextSubmit(String query) {
            list.clear();
            String str = null;
            try {//encoding Chinese character
                str = new String(query
                        .trim().getBytes(), "ISO-8859-1");
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
            SearchPost sp = new SearchPost(SEARCH_URL + str);
            new Thread(sp).start(); 
            return false;
        }
    });

protected class SearchPost implements Runnable{
    public String url = "";
    SearchPost(String urls){
        url = urls;
    }
    public SearchPost() {
    }
    @Override
    public void run() {
        Message message = handler.obtainMessage();
        message.what = DOWNLOAD_COMPLETE;
        try{
            doc = Jsoup.connect(url).get();
                handler.sendMessage(message);
        }catch(IOException e){
            e.printStackTrace();
            message.what = DOWNLOAD_FAIL;
            handler.sendMessage(message);
        }
    }
}

Ответ 1

Поиск того, почему нажатие кнопки один раз вызывает onQueryTextSubmit для запуска дважды, само по себе является проблемой, которую вы, возможно, не сможете решить, поскольку она контролируется операционной системой, которая может быть ошибкой. Реальный вопрос заключается в правильном обращении с случаем, когда кнопка нажата дважды или более в быстрой последовательности, что, вероятно, будет иметь тот же эффект. Я предлагаю, чтобы list.clear() перемещался в том же месте, где вы заполняете список.

Ответ 2

Устранение фокуса на SearchView помогло мне.

sv.clearFocus();

Примечание. Это также скрывает клавиатуру.

Ответ 3

Я продолжаю искать причину и решение этого вопроса и что-то найти. причина, по которой это происходит: https://code.google.com/p/android/issues/detail?id=24599

действие, которое пользователь нажимает на клавишу поиска на клавиатуре, генерирует два ключевых события ACTION_DOWN и ACTION_UP, и некоторое устройство реагирует на оба этих сообщения (должно реагировать только на ACTION_UP), оно оказывается ошибкой SDK или Само устройство, которое не может контролировать нас разработчиками.

Чтобы решить эту проблему, я добавляю "sv.setIconified()", чтобы удалить текст запроса, чтобы сделать ACTION_UP недействительным.

Ответ 4

Поскольку проблема заключается в том, что пользователь нажимает клавишу поиска на клавиатуре, генерирует два ключевых события ACTION_DOWN и ACTION_UP, и какое-то устройство реагирует на оба этих сообщения.

Я решил простым способом, так как мне не нравится setIconified(), потому что после этого искомый текст стирается, я просто разрешаю один поиск в секунду, поэтому сделал следующее:

public boolean onQueryTextSubmit(String s) {

    long actualSearchTime = (Calendar.getInstance()).getTimeInMillis();
    // Only one search every second to avoid key-down & key-up          
    if (actualSearchTime > lastSearchTime + 1000)
    {
        lastSearchTime=actualSearchTime;
    }
}

Ответ 5

У меня возникла эта проблема, потому что я использовал _searchView.setInputType(InputType.TYPE_NULL); поэтому, удалив эту строку, функция onQueryTextSubmit вызывается однажды