2016-04-03 91 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

相關問題