SearchView onQueryTextSubmit 运行两次,而我按一次

问题描述 投票:0回答:6

我正在编写一个搜索函数来访问图书馆网站。提交查询字符串时,程序会启动一个新线程来解析网络上的信息。 它在 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);
        }
    }
}
multithreading searchview
6个回答
31
投票

清除对 SearchView 的关注对我很有帮助。

sv.clearFocus();

注意:这也会隐藏键盘。


4
投票

找出为什么单击按钮一次会导致 onQueryTextSubmit 触发两次本身就是一个问题,您可能无法解决,因为它是由可能有错误的操作系统控制的。真正的问题是如何正确处理快速连续单击按钮两次或多次的情况,这可能会产生相同的效果。我建议将 list.clear() 移动到填充列表的同一位置。


3
投票

问题是用户按下键盘上的搜索键会产生两个按键事件 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;
    }
}

1
投票

我一直在寻找这件事的原因和解决办法,并找到了一些东西。 发生这种情况的原因: https://code.google.com/p/android/issues/detail?id=24599

用户在键盘上按下搜索键的动作会产生两个按键事件 ACTION_DOWN 和 ACTION_UP,并且某些设备会对这两个消息做出反应(应该只对 ACTION_UP 做出反应),事实证明这是 SDK 或设备本身的错误这是我们开发者无法控制的。

为了解决这个问题,我添加“sv.setIconified()”来清空查询文本,以使 ACTION_UP 无效。


1
投票

我遇到这个问题是因为我使用了 _searchView.setInputType(InputType.TYPE_NULL);,所以通过删除这一行 onQueryTextSubmit 函数调用一次


0
投票

我通过放置一个标志来了解该操作何时发生来解决我的问题。

 var isEntered = false

 override fun onQueryTextSubmit(query: String): Boolean {
      if (!isEntered) {
          // perform the action you want to undertake here
        isEntered = true
      }
     return true
 }

   override fun onResume() {
        super.onResume()
        isEntered = false
    }
© www.soinside.com 2019 - 2024. All rights reserved.