FilterQueryProvider, фильтр и ListView - PullRequest
3 голосов
/ 20 февраля 2011

У меня есть база данных следующим образом:

------------------------------
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 () я написал следующее:

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

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

Это ограничение достигает моего переопределения runQueryonBackgroundThread() метод. Но он не обновляет вид сетки и выдает исключение.

"ФИЛЬТР: android.view.ViewRoot $ CalledFromWrongThreadException: только оригинальный поток, создавший иерархию представлений, может касаться его представлений "

Пожалуйста, помогите мне.

1 Ответ

8 голосов
/ 20 февраля 2011

Я думаю, вы немного все испортили.На самом деле 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);
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...