FilterQueryProvider,filter和ListView

ram*_*van 3 android

我有一个数据库如下:

------------------------------
BOOK NAME | BOOK FORMAT | COUNT |
------------------------------
Android   | HTML       | 1
WPF       | PDF        | 10
Symbian   | PS         | 2
Windows   | HTML       | 2
Run Code Online (Sandbox Code Playgroud)

我通过使用CustomSimpleCursorAdapter向用户显示此数据库.

CustomSimpleCursorAdapter extends SimpleCursorAdapter
Run Code Online (Sandbox Code Playgroud)

实现可过滤

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

用户具有以下选项:

HTML | PDF | PS | 删除

Constraint: BOOK FORMAT
[HTML - 1, PDF - 2, PS - 3] 
Run Code Online (Sandbox Code Playgroud)

当用户按下HTML菜单选项时,必须显示具有HTML类型的书籍.

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

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

runQueryonBackgroundThread() {
    if(mCursor != null)
        mCursor.close();
    mCursor = query(using the constraint)
    return mCursor;
}
Run Code Online (Sandbox Code Playgroud)

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

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

请帮我.

Vit*_*nko 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);
    }
};
Run Code Online (Sandbox Code Playgroud)