我有一个数据库如下:
------------------------------
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:只有创建视图层次结构的原始线程才能触及其视图"
请帮我.
我觉得你搞砸了一些东西.实际上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)
| 归档时间: |
|
| 查看次数: |
6805 次 |
| 最近记录: |