我正在编写一个搜索功能来访问图书馆网站。当提交查询字符串时,程序会启动一个新线程来解析网络上的信息。 它在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);
}
}
}
答案 0 :(得分:28)
清除对 SearchView 的关注帮助了我。
<强> sv.clearFocus(); 强>
注意:这也隐藏了键盘。
答案 1 :(得分:4)
找出为什么单击按钮一次导致onQueryTextSubmit触发两次是一个问题,你可能无法解决,因为它是由可能有错误的操作系统控制的。真正的问题是如何正确处理按钮被快速连续点击两次或更多次的情况,这可能会产生相同的效果。我建议将list.clear()移动到填充列表的相同位置。
答案 2 :(得分:1)
我一直在寻找这件事的原因和解决方案,并找到一些东西。 之所以发生这种情况: https://code.google.com/p/android/issues/detail?id=24599
用户在键盘上按下搜索键的操作会产生两个键事件ACTION_DOWN和ACTION_UP,并且某些设备会对这两个消息作出反应(应该仅对ACTION_UP作出反应),结果证明是SDK的错误或设备本身无法由我们的开发人员控制。
要解决这个问题,我添加“sv.setIconified()”来清空querytext,以使ACTION_UP无效。
答案 3 :(得分:1)
问题是用户在键盘上按下搜索键会产生两个键事件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;
}
}
答案 4 :(得分:1)
我遇到了这个问题因为我使用了_searchView.setInputType(InputType.TYPE_NULL);所以通过删除这一行onQueryTextSubmit函数调用一次