Android FilterQueryProvider、filter和ListView

Android FilterQueryProvider、filter和ListView,android,Android,我的数据库如下: ------------------------------ BOOK NAME | BOOK FORMAT | COUNT | ------------------------------ Android | HTML | 1 WPF | PDF | 10 Symbian | PS | 2 Windows | HTML | 2 adapter.getFilter().filter("1"); r

我的数据库如下:

------------------------------
BOOK NAME | BOOK FORMAT | COUNT |
------------------------------
Android   | HTML       | 1
WPF       | PDF        | 10
Symbian   | PS         | 2
Windows   | HTML       | 2
adapter.getFilter().filter("1");

runQueryonBackgroundThread() {
    if(mCursor != null)
        mCursor.close();
    mCursor = query(using the constraint)
    return mCursor;
}
我正在向用户显示此数据库 通过使用CustomSimpleCorsorAdapter

CustomSimpleCursorAdapter extends SimpleCursorAdapter
可过滤的

覆盖
getView()
runQueryonBackgroundThread()

书籍的栅格视图已正确显示

用户具有以下选项:

HTML | PDF | PS |删除

Constraint: BOOK FORMAT
[HTML - 1, PDF - 2, PS - 3] 
当用户按下HTML菜单选项时,将显示包含HTML的书籍 必须显示类型

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

------------------------------
BOOK NAME | BOOK FORMAT | COUNT |
------------------------------
Android   | HTML       | 1
WPF       | PDF        | 10
Symbian   | PS         | 2
Windows   | HTML       | 2
adapter.getFilter().filter("1");

runQueryonBackgroundThread() {
    if(mCursor != null)
        mCursor.close();
    mCursor = query(using the constraint)
    return mCursor;
}
此约束到达我的重写
runQueryonBackgroundThread()
方法。但它不会更新网格视图并引发异常

过滤器:android.view.ViewRoot$CalledFromErrorThreadException:只有 创建视图层次结构的原始线程可以接触其视图“


请帮帮我。

我想你把事情搞砸了。实际上,
SimpleCursorAdapter
已经实现了
Filterable
,因此无需重新实现它。在
列表活动中使用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);
    }
};

嗨,阿希米德,非常感谢你。它工作得很好。:)我还将尝试如何在CustomSimpleCursorAdapter的runQueryonBT中实现它。这很有趣。这在使用装载机时仍然有效吗?我的意思是,与简单地执行restartLoader()相比,使用过滤器查询提供程序有什么优势吗?请看我的问题@faizal:我还没有深入调查过装载机,所以没有权利向您提出任何建议。