2015-05-05 13 views
9

Sử dụng SearchView trong đơn đăng ký của tôi.Trì hoãn cuộc gọi đến onQueryTextChange() trong SearchView.OnQueryTextListener với SearchView

Có cách nào để tôi có thể thực hiện cuộc gọi đến phương thức onQueryTextChange() bị trì hoãn hay không. Giống như, khi người dùng gõ một chuỗi các ký tự, anh ta phải đợi trước khi phương thức này được gọi.

Chờ đợi này phải không phụ thuộc vào số lượng ký tự được nhập nhưng cần tạm dừng một chút trước khi phương pháp được nhấn.

Tôi muốn tạm dừng vì khi người dùng nhập vào chế độ xem tìm kiếm, yêu cầu với chuỗi sẽ được thực hiện cho máy chủ để yêu cầu dữ liệu phù hợp và sau đó tôi sẽ điền ListView của tôi theo đề xuất.

Thông tin hoạt động (nếu cần):
Thực hiện SearchView.OnQueryTextListener.

MenuItem searchItem = menu.findItem(R.id.action_search); 
    SearchView searchView = (SearchView)MenuItemCompat.getActionView(searchItem); 
    searchView.setOnQueryTextListener(this); 
+0

không, tại sao bạn cần điều đó? – pskink

+0

Bạn có thể sử dụng TimerTask để trì hoãn việc lọc danh sách của mình. Đặt mã lọc bên trong bộ hẹn giờ. Tuy nhiên tôi sẽ không khuyên bạn nên trì hoãn tìm kiếm. – Skynet

+0

@pskink Để tìm nạp dữ liệu từ máy chủ khi người dùng nhập vào SearchView. Yêu cầu không được thực hiện mỗi khi một ký tự được gõ, thay vào đó, nên có một tạm dừng. –

Trả lời

8

Để trì hoãn cuộc gọi đến máy chủ của bạn, hãy sử dụng mã sau trong phương thức onQueryTextChange của bạn, các biến mQueryString và mHandler phải là các biến lớp.

@Override 
public boolean onQueryTextChange(String searchTerm) { 
    mQueryString = searchTerm; 
    mHandler.removeCallbacksAndMessages(null); 

    mHandler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      //Put your call to the server here (with mQueryString) 
     } 
    }, 300); 
    return true; 
} 
+0

Điều này giải quyết được vấn đề. Cảm ơn bạn ! –

+0

cảm ơn, hoạt động hoàn hảo! – gayavat

+0

Cảm ơn đã được biết ơn. – Erik

1

trễ cuộc gọi đến onQueryTextChange() trong SearchView.OnQueryTextListener với SearchView

private long delay = 2000; 
private long editTextLastWord = 0; 
privaste SearchView searchView; 
Handler handler = new Handler(); 

private Runnable runnable = new Runnable() { 
    public void run() { 
     if (System.currentTimeMillis() > (editTextLastWord + delay - 500)) { 

      perFormTask(); 
     } 
    } 
}; 
searchView=(SearchView) findViewById(R.id.searchView); 
     searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
      @Override 
      public boolean onQueryTextSubmit(String query) { 
       return false; 
if (s.length() > 2) {    
      editTextLastWord = System.currentTimeMillis(); 
      handler.postDelayed(runnable, delay); 
     } else { 

     } 
      } 

      @Override 
      public boolean onQueryTextChange(String newText) { 
       return false; 
    handler.removeCallbacks(runnable); 
      } 
     }); 
2

này sẽ giúp bạn, lớp học của bạn cần phải thực hiện "SearchView.OnQueryTextListener" và "CNTR" phải được declarated tại của bạn lớp

Điều này đã được nhấp nháy để nhập người dùng thông thường, nếu bạn muốn đợi nhiều hơn, chỉ cần tăng "waitTime".

Yêu cầu nên bên trong "onFinish"

private int waitingTime = 200; 
    private CountDownTimer cntr; 

    @Override 
    public boolean onQueryTextChange(String newText) { 
    if(cntr != null){ 
     cntr.cancel(); 
    } 
    cntr = new CountDownTimer(waitingTime, 500) { 

     public void onTick(long millisUntilFinished) { 
      Log.d("TIME","seconds remaining: " + millisUntilFinished/1000); 
     } 

     public void onFinish() { 
      Log.d("FINISHED","DONE"); 
     } 
    }; 
    cntr.start(); 
    return false; 
} 
Các vấn đề liên quan