Java 控制Android TextWatcher中事件的触发

Java 控制Android TextWatcher中事件的触发,java,android,event-handling,textwatcher,Java,Android,Event Handling,Textwatcher,我不得不用EditText重新创建AutoCompleteTextView的功能(出于不同的原因*&这可能是另一个问题,但我现在正沿着这条路走下去) 每当EditText上的文本发生更改时,我都会发出api调用,从而使我的所有功能正常工作。我通过使用TextWatcher(覆盖afterTextChanged方法)来实现这一点 有没有一种方法可以控制,通过侦听器触发调用的方式 以下是我的用例: 我正在搜索加利福尼亚州 我检查最小长度为3,然后开始触发呼叫。因此,当前发送的API调用数=8 卡尔

我不得不用EditText重新创建AutoCompleteTextView的功能(出于不同的原因*&这可能是另一个问题,但我现在正沿着这条路走下去)

每当EditText上的文本发生更改时,我都会发出api调用,从而使我的所有功能正常工作。我通过使用TextWatcher(覆盖afterTextChanged方法)来实现这一点

有没有一种方法可以控制,通过侦听器触发调用的方式

以下是我的用例:

我正在搜索加利福尼亚州

我检查最小长度为3,然后开始触发呼叫。因此,当前发送的API调用数=8

  • 卡尔
  • 卡利
  • 加州
  • 加州
  • 加利福尼亚州
  • 加州
  • 加利福尼亚州
  • 加州
  • 如果收到新的文本更改,是否有办法取消触发事件?所以当用户输入California时,我会等到出现空白,没有输入新文本,然后调用我的API

    它不必非常精确。在这里和那里发生额外的火灾是完全可以接受的。我希望将触发的事件数量从8个减少到至少3个

    我想在不同的列表视图中显示自动完成结果,而不是自动完成文本视图旁边的弹出窗口


    请尝试以下TextWatcher:

    TextWatcher t = new TextWatcher() {
            long lastChange = 0;
    
            @Override
            public void onTextChanged(CharSequence s, int start, int before,
                    int count) {
    
                // TODO Auto-generated method stub
                if (s.length() > 3) {
                    new Handler().postDelayed(new Runnable() {
                        public void run() {
                            if (System.currentTimeMillis() - lastChange >= 300) {
                                //send request
                            }
                        }
                    }, 300);
                    lastChange = System.currentTimeMillis();
    
                }
            }
    
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count,
                    int after) {
                // TODO Auto-generated method stub
    
            }
    
            @Override
            public void afterTextChanged(Editable s) {
                // TODO Auto-generated method stub
    
            }
    };
    

    啊,这看起来真有趣。谢谢Vipul,我将尝试您发布的解决方案,并在运行后将其标记为答案。快速跟进,您发布的代码的处理程序看起来会延迟发出请求(这很好)。是否也有可能取消prev请求?因为if语句“(System.currentTimeMillis()-lastChange>300)”如果用户键入介于两者之间的任何内容,此处理程序将不会执行任何操作。例如:让我们假设在currentTime=1000时,用户键入了一些内容,并保持键入100110021003,因此thr将为4个不同的处理程序进行初始化,lastChange中的值为1003。第一个处理程序将在1300和1300-1003被调用,您可能需要在检查时写入>=。快跑,让我知道。