2016-04-03 9 views
0

Ich habe eine benutzerdefinierte Autocomplete-Funktion, die Ergebnisse von einem Remote-Server in der onQueryTextChange Methode basierend auf der Eingabe abruft. Es ähnelt dem JQuery-Autocomplete-Plug-in, das Ergebnisse über Ajax auf Keyup-Listener abruft.Wie erkennt man, ob der Benutzer in SearchView.setOnQueryTextListener nur die Rücktaste (delete) drückt?

Es ist jedoch eine ziemliche Verschwendung, Ergebnisse abzurufen, wenn der Benutzer gerade backspace drückt, um den Eingabetext zu löschen, den er zuvor eingegeben hat, da die zurückgegebenen Ergebnisse in meiner Situation normalerweise gleich sind. Wie kann ich das verhindern?

Ich habe versucht, eine globale boolean Variable backKeyPressed zu erkennen, ob der Benutzer backspace drücken und überprüfen Sie es in onQueryTextChange aber setOnKeyListener nicht einmal bei allen. Im logcat wurden keine Protokolle für "onKey" angezeigt.

Hätte jemand Ideen, wie man erkennt, ob die Rücktaste in onQueryTextChange gedrückt wird?

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

Wenn der Benutzer normalerweise die Rücktaste drückt, sollten Sie mehr Ergebnisse erhalten, oder? Was ist der Grund dafür? – pskink

+0

Verwenden Sie Soft-Tastaturen? weil OnKeyListener nicht funktioniert. http://stackoverflow.com/q/4886858/2252016 – 1binary0

+0

@ 1binary0, ah ja, ich benutze Soft-Tastaturen – RedGiant

Antwort

2

Wenn Sie die Rücktaste nicht erhalten können. Sie könnten eine einfache Arbeit verwenden.

Sie könnten die length Ihrer Abfragezeichenfolge speichern, wenn ein Server-Aufruf erfolgt. Dann das nächste Mal in onQueryTextChange können Sie überprüfen, ob die Länge von inputText ist kleiner als die Länge der Serveraufrufzeichenfolge. Wenn dies nicht der Fall ist, aktualisieren Sie die Serveranruflänge mit dieser neuen Länge, denn wenn Sie das nächste Mal nicht zwei Zeichen entfernen und ein neues Zeichen hinzufügen, wird Ihr Code keinen Serveraufruf durchführen. Wenn Sie einen Pseudocode wollen, lassen Sie es mich wissen.

+0

Ich habe schnell einen Code hinzugefügt, der auf Ihrem Vorschlag basiert. Siehe Variable 'eingegebeneSuggestion', die zum Speichern des vorherigen Eingabewerts verwendet wird. Wenn es dem aktuellen Eingabewert entspricht, wird kein Serveraufruf durchgeführt. Als nächstes werde ich daran arbeiten, die Längen von ihnen zu vergleichen. Nur eine ungefähre Idee. Bitte zögern Sie nicht, mir einige Vorschläge zu machen. – RedGiant

+0

Ja das ist großartig! Nur eine Sache, in Ihrem OnQueryTextChange haben Sie diese Zuordnung verwendet. 'eingegebeneSuggestion = itemTitle;'. Sollte es nicht "eingegebeneSuggestion = inputText;" sein? –

+1

Ja, ich habe den Beitrag aktualisiert. – RedGiant