24

当用户输入 EditText 时,我使用以下代码执行搜索:

EditText queryView = (EditText) findViewById(R.id.querybox);
queryView.addTextChangedListener(new TextWatcher() {
  @Override
  public void afterTextChanged(Editable s) {
    triggerSearch(s.toString()); 
  }
  @Override
  public void beforeTextChanged(CharSequence s, int start, int count, int after) {
  }
  @Override
  public void onTextChanged(CharSequence s, int start, int before, int count) {
  }
});

但是,当用户键入一个单词时,这会触发多次。也就是说,如果用户键入“hello”,此代码将触发 5 次值(“h”、“he”、“hel”、“hell”、“hello”)。通常,这会很好,但触发搜索很昂贵,我不想将资源浪费在没有多大用处的中间搜索上。我想要的是在用户开始键入后仅触发某个阈值的侦听器,或者是某种框架,它在调用之前在侦听器中等待triggerSearch,如果在该等待之前触发了另一个事件,则会自行取消。

4

4 回答 4

51

由于找不到合适的事件接口,尝试触发延迟搜索。代码实际上非常简单和健壮。

private final int TRIGGER_SERACH = 1;
// Where did 1000 come from? It's arbitrary, since I can't find average android typing speed.
private final long SEARCH_TRIGGER_DELAY_IN_MS = 1000;

  private Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
      if (msg.what == TRIGGER_SERACH) {
        triggerSearch();
      }
    }
  };

 queryView.addTextChangedListener(new TextWatcher() {

   @Override
   public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {

   }

   @Override
   public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {

   }

   @Override
   public void afterTextChanged(Editable s) {
    handler.removeMessages(TRIGGER_SERACH);
    handler.sendEmptyMessageDelayed(TRIGGER_SERACH, SEARCH_TRIGGER_DELAY_IN_MS);
   });
于 2012-04-19T09:00:58.960 回答
4

onTextChanged一种解决方案是不立即执行触发的搜索,而是在调用该方法后经过一段时间(例如 100 毫秒)后执行触发搜索。此外,每次键入文本时都会重置此间隔。

这样,在用户键入时不会调用触发的搜索。

于 2012-04-18T20:16:51.300 回答
3

在调用之前在监听器中等待triggerSearch;测试 的长度Editable s

if(s.length() > THRESHOLD)

于 2012-04-18T20:19:33.553 回答
1

如果您不想在按下的每个按钮上触发搜索,那么您需要知道用户何时完成。我会避免试图弄清楚用户何时完成输入的复杂想法。这将导致用户对搜索发生的时间感到困惑。

然后简单的答案是放置一个“完成”按钮并在按钮上应用一个 onClickListener 并在那里执行您的搜索。

最简单的代码:在xml中

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

在java中:

@Override
public void onDoneClicked(View view){
EditText queryView = (EditText) findViewById(R.id.querybox);
triggerSearch(queryView.toString());
}
于 2012-04-18T21:50:50.210 回答