2011-10-08 67 views
1

我正在使用FilterQueryProvider來過濾由自定義CursorAdapter備份的列表視圖的內容。如何異步運行FilterQueryProvider的查詢?

要使用FilterQueryProvider,您必須重寫runQuery()方法,該方法返回一個Cursor對象。現在我想知道如何異步查詢遊標以避免阻塞UI線程。

是否有某種最佳實踐?我無法找到runQuery()方法是在UI線程還是在它自己的線程上執行的任何信息。

回答

3

從文檔:

通過調用過濾器(CharSequence的, android.widget.Filter.FilterListener)進行

過濾操作都是異步執行

所以你的代碼應該是這樣的:

private void filterList(CharSequence constraint) { 
    final YourListCursorAdapter adapter = 
     (YourListCursorAdapter) getListAdapter(); 
    final Cursor oldCursor = adapter.getCursor(); 
    adapter.setFilterQueryProvider(filterQueryProvider); 
    adapter.getFilter().filter(constraint, new FilterListener() { 
     public void onFilterComplete(int count) { 
      // assuming your activity manages the Cursor 
      stopManagingCursor(oldCursor); 
      final Cursor newCursor = adapter.getCursor(); 
      startManagingCursor(newCursor); 
      // safely close the oldCursor 
      if (oldCursor != null && !oldCursor.isClosed()) { 
       oldCursor.close(); 
      } 
     } 
    }); 
} 

private FilterQueryProvider filterQueryProvider = new FilterQueryProvider() { 
    public Cursor runQuery(CharSequence constraint) { 
     return dbHelper.getListCursor(constraint); 
    } 
}; 

來源:thisthis

+0

是什麼''''dbHelper''''? – Zach