2009-11-23 83 views
0

在Android我有大的列表視圖,它必須支持過濾。現在我的實現如下。實現搜索字段android

EditText和TextWatcher監聽文本更改。所有的數據都存儲在數據庫中,並且當有TextChange事件獲取遊標並將新的CursorAdapter設置爲列表視圖時。我使用AsyncTask來查詢數據庫並更新gui。

但總會有一些問題,這種方法:

  1. 的AsyncTask開始,每TextChange事件。

  2. 的的AsyncTask應該是同步的

那麼什麼是落實其元素存儲在數據庫列表視圖搜索領域的最佳途徑。

回答

3

大多數適配器實現還實現過濾的接口,它是非常有用的。

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

根據文檔Filter.filter(CharSequence的約束)那樣 - 啓動異步濾波操作。調用此方法將取消所有先前未執行的過濾請求,併發布稍後將執行的新過濾請求。這完全適合我的需求。

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); 
}