FilterQueryProvider,filter和ListView

时间:2011-02-20 13:42:22

标签: android

我有一个数据库如下:

------------------------------
BOOK NAME | BOOK FORMAT | COUNT |
------------------------------
Android   | HTML       | 1
WPF       | PDF        | 10
Symbian   | PS         | 2
Windows   | HTML       | 2

我正在向用户显示此数据库 通过使用CustomSimpleCursorAdapter。

CustomSimpleCursorAdapter extends SimpleCursorAdapter

实现可过滤的

getView()& runQueryonBackgroundThread()被覆盖 正确显示了书籍的网格视图。

用户有以下选择:

HTML | PDF | PS |删除

Constraint: BOOK FORMAT
[HTML - 1, PDF - 2, PS - 3] 

当用户按下HTML菜单选项时,书籍会带有HTML 必须显示类型。

在MenuOption handler()中,我写了如下:

adapter.getFilter().filter("1");

runQueryonBackgroundThread() {
    if(mCursor != null)
        mCursor.close();
    mCursor = query(using the constraint)
    return mCursor;
}

这个约束达到我的覆盖runQueryonBackgroundThread() 方法。但它没有更新网格视图并引发异常。

  

“FILTER:android.view.ViewRoot $ CalledFromWrongThreadException:只有   创建视图层次结构的原始线程可以触及其视图“

请帮帮我。

1 个答案:

答案 0 :(得分:8)

我觉得你搞砸了一些东西。实际上SimpleCursorAdapter已经实现了Filterable,所以没有必要重新实现它。相反,在你的ListActivity中使用smth:

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 
            // (which is a recommended way)
            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) {
        // assuming you have your custom DBHelper instance 
        // ready to execute the DB request
        return dbHelper.getListCursor(constraint);
    }
};