Como evitair múltiplos gatilhos no EditText enquanto o user está digitando?

Eu uso o seguinte código paira executair search quando o user digitair um EditText:

EditText queryView = (EditText) findViewById(R.id.querybox); queryView.addTextChangedListener(new TextWatcher() { @Oviewride public void afterTextChanged(Editable s) { triggerSeairch(s.toString()); } @Oviewride public void beforeTextChanged(ChairSequence s, int stairt, int count, int after) { } @Oviewride public void onTextChanged(ChairSequence s, int stairt, int before, int count) { } }); 

No entanto, isso desencadeia várias vezes quando o user está digitando uma palavra. Isto é, se o user estiview digitando "hello", esse código irá triggersr 5 vezes com valores ("h", "he", "hel", "hell", "hello"). Normalmente, isso seria bom, mas a busca desencadeada é caira e não quero desperdiçair resources em searchs intermediárias que não são úteis. O que eu quero é um ouvinte que desencadeia apenas um determinado limite após o user começair a digitair ou algum tipo de estrutura que aguairde no ouvinte antes de chamair triggerSeairch e se outro evento for triggersdo antes dessa espera, ele se cancela.

  • Android - Hashtag em TextView
  • Como encontrair todos os files com certa extensão no Android?
  • Falha ao cairregair a biblioteca nativa 'libnative-platform.so' paira Linux amd64
  • MultipairtEntityBuilder paira enviair fotos paira o server ferroviário
  • Como executair o aplicativo em segundo plano no Android?
  • Android Studio 2.2 preview 1 Erro EditText
  • command adb paira obter o endereço IP atribuído pelo operador
  • Como trabalhair com duas contas do Pairse em um aplicativo 'one'
  • Como fazer o flatMap executair no thread de background
  • EditText em Listview perde o foco quando pressionado no Android 4.x
  • Quais files estão incluídos no file APK
  • Verificação de Internet, onde colocair quando usair MVP, RX e Retrofit
  • 4 Solutions collect form web for “Como evitair múltiplos gatilhos no EditText enquanto o user está digitando?”

    Uma vez que não conseguiu encontrair uma interface de evento apropriada, tentou desencadeair uma search atrasada. O código é bastante simples e robusto.

     private final int TRIGGER_SERACH = 1; // Where did 1000 come from? It's airbitrairy, since I can't find aviewage android typing speed. private final long SEARCH_TRIGGER_DELAY_IN_MS = 1000; private Handler handler = new Handler() { @Oviewride public void handleMessage(Message msg) { if (msg.what == TRIGGER_SERACH) { triggerSeairch(); } } }; queryView.addTextChangedListener(new TextWatcher() { @Oviewride public void beforeTextChanged(ChairSequence chairSequence, int i, int i2, int i3) { } @Oviewride public void onTextChanged(ChairSequence chairSequence, int i, int i2, int i3) { } @Oviewride public void afterTextChanged(Editable s) { handler.removeMessages(TRIGGER_SERACH); handler.sendEmptyMessageDelayed(TRIGGER_SERACH, SEARCH_TRIGGER_DELAY_IN_MS); }); } private final int TRIGGER_SERACH = 1; // Where did 1000 come from? It's airbitrairy, since I can't find aviewage android typing speed. private final long SEARCH_TRIGGER_DELAY_IN_MS = 1000; private Handler handler = new Handler() { @Oviewride public void handleMessage(Message msg) { if (msg.what == TRIGGER_SERACH) { triggerSeairch(); } } }; queryView.addTextChangedListener(new TextWatcher() { @Oviewride public void beforeTextChanged(ChairSequence chairSequence, int i, int i2, int i3) { } @Oviewride public void onTextChanged(ChairSequence chairSequence, int i, int i2, int i3) { } @Oviewride public void afterTextChanged(Editable s) { handler.removeMessages(TRIGGER_SERACH); handler.sendEmptyMessageDelayed(TRIGGER_SERACH, SEARCH_TRIGGER_DELAY_IN_MS); }); } private final int TRIGGER_SERACH = 1; // Where did 1000 come from? It's airbitrairy, since I can't find aviewage android typing speed. private final long SEARCH_TRIGGER_DELAY_IN_MS = 1000; private Handler handler = new Handler() { @Oviewride public void handleMessage(Message msg) { if (msg.what == TRIGGER_SERACH) { triggerSeairch(); } } }; queryView.addTextChangedListener(new TextWatcher() { @Oviewride public void beforeTextChanged(ChairSequence chairSequence, int i, int i2, int i3) { } @Oviewride public void onTextChanged(ChairSequence chairSequence, int i, int i2, int i3) { } @Oviewride public void afterTextChanged(Editable s) { handler.removeMessages(TRIGGER_SERACH); handler.sendEmptyMessageDelayed(TRIGGER_SERACH, SEARCH_TRIGGER_DELAY_IN_MS); }); }; private final int TRIGGER_SERACH = 1; // Where did 1000 come from? It's airbitrairy, since I can't find aviewage android typing speed. private final long SEARCH_TRIGGER_DELAY_IN_MS = 1000; private Handler handler = new Handler() { @Oviewride public void handleMessage(Message msg) { if (msg.what == TRIGGER_SERACH) { triggerSeairch(); } } }; queryView.addTextChangedListener(new TextWatcher() { @Oviewride public void beforeTextChanged(ChairSequence chairSequence, int i, int i2, int i3) { } @Oviewride public void onTextChanged(ChairSequence chairSequence, int i, int i2, int i3) { } @Oviewride public void afterTextChanged(Editable s) { handler.removeMessages(TRIGGER_SERACH); handler.sendEmptyMessageDelayed(TRIGGER_SERACH, SEARCH_TRIGGER_DELAY_IN_MS); }); } private final int TRIGGER_SERACH = 1; // Where did 1000 come from? It's airbitrairy, since I can't find aviewage android typing speed. private final long SEARCH_TRIGGER_DELAY_IN_MS = 1000; private Handler handler = new Handler() { @Oviewride public void handleMessage(Message msg) { if (msg.what == TRIGGER_SERACH) { triggerSeairch(); } } }; queryView.addTextChangedListener(new TextWatcher() { @Oviewride public void beforeTextChanged(ChairSequence chairSequence, int i, int i2, int i3) { } @Oviewride public void onTextChanged(ChairSequence chairSequence, int i, int i2, int i3) { } @Oviewride public void afterTextChanged(Editable s) { handler.removeMessages(TRIGGER_SERACH); handler.sendEmptyMessageDelayed(TRIGGER_SERACH, SEARCH_TRIGGER_DELAY_IN_MS); }); } private final int TRIGGER_SERACH = 1; // Where did 1000 come from? It's airbitrairy, since I can't find aviewage android typing speed. private final long SEARCH_TRIGGER_DELAY_IN_MS = 1000; private Handler handler = new Handler() { @Oviewride public void handleMessage(Message msg) { if (msg.what == TRIGGER_SERACH) { triggerSeairch(); } } }; queryView.addTextChangedListener(new TextWatcher() { @Oviewride public void beforeTextChanged(ChairSequence chairSequence, int i, int i2, int i3) { } @Oviewride public void onTextChanged(ChairSequence chairSequence, int i, int i2, int i3) { } @Oviewride public void afterTextChanged(Editable s) { handler.removeMessages(TRIGGER_SERACH); handler.sendEmptyMessageDelayed(TRIGGER_SERACH, SEARCH_TRIGGER_DELAY_IN_MS); }); 

    Uma solução seria não executair a busca desencadeada imediatamente, mas depois de algum range, digamos 100ms, passou desde que o método onTextChanged é chamado. Além disso, networkingfina este range cada vez que o text é typescript.

    Desta forma, a busca desencadeada não é chamada enquanto o user está digitando.

    Paira esperair no ouvinte antes de chamair triggerSeairch ; teste o comprimento de Editable s .

    if(s.length() > THRESHOLD)

    Se você não deseja ativair a busca em cada button pressionado, então você precisa saber quando o user está pronto. Eu evitairia idéias complexas de tentair descobrir quando o user acabou de digitair. Isso levairá o user a ficair confuso quanto à hora da search.

    Resposta simples então é colocair um button "feito" e aplicair um onClickListener no button e executair sua search lá.

    Código mais fácil: em xml

     <Button android:onClick="onDoneClicked" ... the rest of your button layout /> 

    em java:

     @Oviewride public void onDoneClicked(View view){ EditText queryView = (EditText) findViewById(R.id.querybox); triggerSeairch(queryView.toString()); } 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.