2009-11-23 3 views
0

sur android J'ai une grande liste qui doit supporter le filtrage. Pour l'instant, ma mise en œuvre est la suivante. EditText et TextWatcher pour écouter les changements de texte. Toutes les données sont stockées dans db et quand il y a un événement pour TextChange chercher un curseur et définir un nouvel CursorAdapter à la liste. J'utilise AsyncTask pour interroger le db et mettre à jour le gui.Mettre en œuvre le champ de recherche android

Mais il arrive quelques problèmes avec cette approche:

  1. AsyncTask est lancé pour chaque événement TextChange.

  2. Le AsyncTask doit être synchronisé

Alors, quelle est la meilleure façon de mettre en œuvre le champ de recherche pour un listview quels éléments sont stockés dans db.

Répondre

3

La plupart des implémentations de l'adaptateur implémentent également une interface filtrable très utile.

Filter filter = myAdapter.getFilter(); 
filter.filter(mySearchText); 

Selon la documentation filtre.Filtre (de contrainte CharSequence) fait - démarre une opération de filtrage asynchrone. L'appel de cette méthode annule toutes les demandes de filtrage non exécutées précédentes et affiche une nouvelle demande de filtrage qui sera exécutée ultérieurement. Ce qui convient parfaitement à mes besoins.

0

Dans votre activité, conservez une référence statique à la tâche asynchrone lorsque vous la démarrez. Ensuite, si l'utilisateur tape une autre clé avant la fin de la tâche asynchrone précédente, annulez-la manuellement et relancez-en une autre. Cela devrait atténuer la plupart des problèmes (bien que vous ayez des problèmes pour rafraîchir la liste si c'est un grand ensemble de données). Quelque chose comme ce qui suit devrait vous aider à démarrer:

private static AsyncTask _currentFilterTask; 

public doFilter(String userInput) 
{ 
    if (_currentFilterTask != null && _currentFilterTask.getStatus().equals()) 
    { 
    _currentFilterTask.cancel(true); 
    } 
    _currentFilterTask = new MyAsyncTask(userInput); 
    _currentFilterTask.execute(this); 
} 
Questions connexes