2014-01-08 18 views
1

我不得不用EditTexts重新創建AutoCompleteTextViews的功能(出於不同的原因* &這可能是另一個問題,但我現在下了這條路徑)。在TextWatcher中控制事件的觸發Android的

當我的EditText中的文本發生變化時,我通過發出api調用來獲得所有功能。我通過使用TextWatcher來執行此操作(覆蓋afterTextChanged方法)。

有沒有一種方法可以控制,調用與監聽器一起觸發的方式?

這裏是我的使用案例:

我在尋找加州

我查了一分鐘。長度爲3,然後開始發射呼叫。所以API調用數當前發送= 8

  1. 卡爾
  2. 卡利
  3. 加州
  4. Califor
  5. Californ
  6. 加利福尼亞州
  7. 加州

如果我收到新的文本更改,是否可以取消已觸發的事件?因此,當用戶輸入California時,我會等到沒有輸入新文本的間隙,然後再打電話給我的API?

它不一定非常準確。在這裏和那裏發生的其他事件是完全可以接受的。我希望將事件數從8減少到至少3.

我想在不同列表視圖中顯示自動完成結果與自動完成文本視圖旁邊的彈出窗口。

回答

4

嘗試以下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 

     } 
}; 
+0

啊,這看起來真的很有趣。感謝Vipul,我會嘗試您的發佈解決方案,並將其標記爲答案,只要我得到它運行。快速跟進,您發佈的代碼的Handler位看起來像會以延遲的方式發出請求(這很棒)。是否還有可能取消prev要求? –

+0

因爲if語句「(System.currentTimeMillis() - lastChange> 300)」如果用戶在這個處理程序之間鍵入任何內容都不會執行任何操作。例如: –

+0

for ex:可以說currentTime = 1000用戶輸入了一些內容並保持爲1001,1002,1003輸入,所以thr將4個不同的處理程序初始化並且lastChange = 1003中的值。第一個處理程序將在1300和1300-1003 <300之間調用,因此對於其餘的exept 1003,什麼也不會發生。 –

相關問題