2011-02-20 3 views
3

I ont une base de données comme suit:FilterQueryProvider, filtre et ListView

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

Je montre cette base de données à l'utilisateur en utilisant un CustomSimpleCursorAdapter.

CustomSimpleCursorAdapter extends SimpleCursorAdapter 

implémente filtrables

avec getView() & runQueryonBackgroundThread() être outrepassée.
La vue Grille des livres est correctement affichée.

L'utilisateur a les options suivantes:

HTML | PDF | PS | SUPPRIMER

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

Lorsque l'utilisateur appuie sur l'option de menu HTML, les livres de type HTML doit être montré.

intérieur gestionnaire MenuOption(), je l'ai écrit comme suit:

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

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

Cette contrainte pour atteindre mon overriden runQueryonBackgroundThread() méthode . Mais il ne met pas à jour la vue de la grille et déclenche une exception.

"FILTER: android.view.ViewRoot $ CalledFromWrongThreadException: Seul le thread d'origine qui a créé une hiérarchie de vue peut toucher son point de vue"

S'il vous plaît aidez-moi.

Répondre

8

Je pense que vous avez un peu bousillé les choses. En fait, SimpleCursorAdapter implémente déjà Filterable, il n'est donc pas nécessaire de le réimplémenter. Au lieu de cela dans votre ListActivity utiliser comme ceci:

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

Salut Arhimed, Merci beaucoup. Cela fonctionne très bien. :) Je vais aussi essayer de le faire dans runQueryonBT de CustomSimpleCursorAdapter. – ramsarvan

+0

c'est intéressant. est-ce toujours valable lors de l'utilisation de chargeurs? Je veux dire, y a-t-il un avantage à utiliser le fournisseur de requête de filtre plutôt que de faire un restartLoader()? Voir ma question http://stackoverflow.com/questions/24344950/filtering-with-loadermanager-and-content-provider – faizal

+0

@faizal: Je n'ai pas étudié des chargeurs aussi profonds, donc je n'ai pas le droit de vous suggérer quoi que ce soit. –

Questions connexes