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