2013-02-02 2 views
9

나는 의 항목을 필터링하기 위해 EditText을 가지고 있는데, 일반적으로 1000 개 이상의 항목을 포함 할 수 있습니다. TextWatcher은 다음과 같습니다 여기몇 가지 조치를 취하기 전에 얼마 동안 TextWatcher를 대기하게하는 방법

txt_itemSearch.addTextChangedListener(new TextWatcher() { 

public void onTextChanged(CharSequence s, int start, int before, int count) { 
    fillItemList(); 
} 
public void afterTextChanged(Editable s) { 
} 

public void beforeTextChanged(CharSequence s, int start, int count, 
       int after) { 
} 
}); 

문제는 사용자가 입력 한 각 문자로 목록을 새로 고칠지고와는 UI가 느린 원인이 반복 목록 업데이트 점이다.

TextWatcher을 1-2 초 동안 대기시키고 2 초 후에 입력이 더 이상 발생하지 않으면 어떻게 할 수 있습니까? 어떤 제안이 있니?

+1

* 모든 제안들 * - 어댑터의'getFilter를 (사용하여'ListView'을 필터링하는 적절한 방법을 사용)'메소드를 호출합니다. – Luksprog

+0

괜찮지 만 필터링은 다소 복잡합니다. 또한 두 개의 Checkboxes와 다른 매개 변수를 필터링해야하므로 내 유일한 옵션은 SQLite 쿼리를 통해 얻는 것입니다. – desidigitalnomad

답변

16

텍스트 워커를 1 초 동안 기다리거나 2 초 후에 더 이상 입력하지 않으면 이 발생하면 목록을 필터링하십시오.

이미 의견에서 어댑터의 getFilter() 메서드를 사용해야합니다. 어댑터의 필터가 필터 입력 사이에서 취소하는 데 사용하는 것과 동일한 메커니즘을 구현하려고 시도하면 적합하지 않을 수 있습니다. filterTask

private Handler mHandler = new Handler(); 

public void afterTextChanged(Editable s) { 
     mHandler.removeCallbacks(mFilterTask); 
     mHandler.postDelayed(mFilterTask, 2000); 
} 

입니다 :

Runnable mFilterTask = new Runnable() { 

    @Override 
    public void run() { 
      fillItemList(); 
    }  
} 
+1

효과가 있습니다! 지금 우유처럼 부드럽게. 감사! – desidigitalnomad

+0

LogCat을 지금 검사하면 2 초 후에 처리가 진행되지만 Runnable은 여러 번 실행됩니다. 예를 들어, 'sof'를 입력하면 fillItemList가 's', 'so'및 'sof'에 대해 세 번 실행됩니다. 나는 Handler.removeCallbacks가 처리 할 것이라고 생각했지만 그렇지 않았다. – desidigitalnomad

+0

@rbH 확실한가요? 당신은 충분히 빨리 타이핑하고 있습니까? – Luksprog

0

RxBinding 사용 :

RxTextView.textChanges(edittext) 
      .skipInitialValue() 
      .debounce(TIME_TO_WAIT, TimeUnit.MILLISECONDS) 
      .subscribe({ 
       //do the thing 
      }) 
} 
관련 문제