2009-11-23 4 views
0

on android 필터링을 지원해야하는 큰 listview가 있습니다. 당분간은 다음과 같습니다.검색 필드 구현 android

EditText 및 TextWatcher는 텍스트 변경 내용을 수신 대기합니다. 모든 데이터는 db에 저장되며 TextChange 이벤트가있을 때 커서를 가져 와서 새 CursorAdapter를 listview에 설정합니다. AsyncTask를 사용하여 db를 쿼리하고 gui를 업데이트합니다.

그러나이 방법 몇 가지 문제가 온다 :

  1. AsyncTask를 모든 TextChange 이벤트를 시작합니다.

  2. 은 AsyncTask를이

을 동기화해야합니다 그래서 요소가 DB에 저장되어있는리스트 뷰에 대한 검색 필드를 구현하는 가장 좋은 방법은 무엇인지.

답변

3

대부분의 어댑터 구현 또한 매우 유용한 Filterable 인터페이스를 구현합니다. 문서 Filter.filter (CharSequence를 제약)에 따르면

Filter filter = myAdapter.getFilter(); 
filter.filter(mySearchText); 

는 않습니다 - 비동기 필터링 작업을 시작합니다. 이 메서드를 호출하면 이전에 실행되지 않은 모든 필터링 요청이 취소되고 나중에 실행될 새 필터링 요청이 게시됩니다. 내 요구 사항에 완벽하게 맞는.

0

액티비티에서 액티비티를 킥오프 할 때 AsyncTask에 대한 정적 참조를 유지하십시오. 그런 다음 사용자가 이전 AsyncTask가 완료되기 전에 다른 키를 입력하면 수동으로 취소하고 다른 키를 시작합니다. 그렇게하면 대부분의 문제가 완화됩니다 (큰 데이터 세트 인 경우 목록을 새로 고치는 데 문제가있을 수 있음). 다음과 같은 것을 시작해야합니다 :

private static AsyncTask _currentFilterTask; 

public doFilter(String userInput) 
{ 
    if (_currentFilterTask != null && _currentFilterTask.getStatus().equals()) 
    { 
    _currentFilterTask.cancel(true); 
    } 
    _currentFilterTask = new MyAsyncTask(userInput); 
    _currentFilterTask.execute(this); 
}