FilterQueryProvider,过滤器和ListView

3

我有一个如下的数据库:

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

我使用自定义的SimpleCursorAdapter将这个数据库展示给用户。

CustomSimpleCursorAdapter extends SimpleCursorAdapter

实现可过滤性

通过重写 getView()runQueryonBackgroundThread() 方法,正确显示了书籍的网格视图。

用户有以下选项:

HTML | PDF | PS | DELETE

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

当用户按下HTML菜单选项时,必须显示HTML类型的书籍。
在MenuOption处理程序中,我编写了以下内容:
adapter.getFilter().filter("1");

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

这个限制影响了我重写的runQueryonBackgroundThread()方法。但它没有更新网格视图并抛出异常。

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

请帮助我。

1个回答

8

我认为你有点搞错了。实际上,SimpleCursorAdapter 已经实现了 Filterable,因此无需重新实现它。相反,在你的 ListActivity 中使用类似于以下代码:

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

嗨,Arhimed,非常感谢。它运行得很好。 :) 我还将尝试在CustomSimpleCursorAdapter的runQueryonBT中如何执行它。 - ramsarvan
这很有趣。在使用加载器时,这仍然有效吗?我的意思是,使用过滤查询提供程序是否比仅执行restartLoader()更有优势?请参阅我的问题http://stackoverflow.com/questions/24344950/filtering-with-loadermanager-and-content-provider - faizal
@faizal:我对加载器的研究不够深入,因此没有权利向您提出任何建议。 - Vit Khudenko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接