2016-04-03 95 views
0

我有一个自定义自动完成功能,它根据输入从onQueryTextChange方法中的远程服务器获取结果。它类似于JQuery自动完成插件,它通过Ajax在关键字侦听器上获取结果。如何检测用户是否只是在SearchView.setOnQueryTextListener中按下退格键(删除)?

但是,当用户刚刚按下backspace删除他先前输入的输入文本时,获取结果相当浪费,因为返回的结果通常与我的情况相同。我怎样才能防止这种情况发生?

我一直在使用一个全局布尔变量backKeyPressed来检测用户是否按下backspace并检查它在onQueryTextChangesetOnKeyListener甚至没有在所有的工作尝试。 logcat中甚至没有显示“onKey”的日志。

有没有人有任何想法如何检测退格键是否按下onQueryTextChange

private boolean backKeyPressed = false; 
private Runnable autoCompleteRunnable; 
private Handler = new Handler(Looper.getMainLooper()); 
private String enteredSuggestion = ""; 

public boolean onCreateOptionsMenu(Menu menu) { 

    /****************/ 

    searchView.setOnKeyListener(new View.OnKeyListener() { 
       @Override 
       public boolean onKey(View v, int keyCode, KeyEvent event) { 

        if (keyCode == KeyEvent.KEYCODE_DEL) { 
         backKeyPressed = true; 
        }else{ 
         backKeyPressed = false; 
        } 
        Log.d("onKey",Boolean.toString(backKeyPressed)); 
        return false; 
       } 
      }); 

      searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
       @Override 
       public boolean onQueryTextSubmit(String query) { 
        /**Some functions**/ 
        return false; 
       } 

       @Override 
       public boolean onQueryTextChange(final String inputText) { 
        handler.removeCallbacks(autoCompleteRunnable); 

        if(enteredSuggestion.trim().equals(inputText.trim())){ 
         Log.d("response_on_duplicated","true"); 
         return false; 
        } 

        if(backKeyPressed == true){ 
         Log.d("response_onKey","No"); 
         return false; 
        } 
        autoCompleteRunnable = new Runnable() { 
         public void run() { 
          fetchSuggestionFromRemoteServer(inputText); 
         } 
        }; 
        handler.postDelayed(autoCompleteRunnable, 3000); 

        enteredSuggestion = inputText; 

        return false; 
       } 
      }); 
} 
+0

如果用户按退格键通常你应该得到更多的结果,是吗?那么这是什么原因? – pskink

+0

你使用软键盘吗?因为OnKeyListener不起作用。 http://stackoverflow.com/q/4886858/2252016 – 1binary0

+0

@ 1binary0,啊是的,我正在使用软键盘 – RedGiant

回答

2

如果你不能得到退格键。您可以使用简单的解决方法。

您可以在进行服务器调用时存储查询字符串的length。 然后在onQueryTextChange下一次您可以检查inputText的长度是否小于服务器调用字符串的长度。如果更少,则使用此新长度更新服务器调用长度,因为如果您下次没有用户删除2个字符并添加1个新字符,则您的代码不会进行服务器调用。如果你想要一个伪代码,请告诉我。

+0

我已根据您的建议快速添加了一些代码。参见用于存储先前输入值的变量'enteredSuggestion'。如果它与当前输入值相同,则不会进行服务器调用。接下来我会努力比较它们的长度。只是一个粗略的想法。请随时给我一些建议。 – RedGiant

+0

是的,太棒了!只是一件事,在你的'onQueryTextChange'中,你已经使用了这个任务。 'enterSuggestion = itemTitle;'。不应该是'enterSuggestion = inputText;'? –

+1

是的,我已更新该帖子。 – RedGiant

相关问题