2010-04-19 4 views
14

J'ai un ArrayAdapter enroulé autour d'une ArrayList d'objets personnalisés. Je voudrais écrire un filtre personnalisé pour cet adaptateur de sorte que lorsque j'appelle getListAdapter().getFilter().filter("abc") la liste sera filtrée par une transformation arbitraire de "abc".Comment remplacer le filtre dans ArrayAdapter d'android?

Je pensais que je voudrais simplement remplacer ArrayAdapter.getFilter(), mais cela nécessite de ré-implémenter le privé ArrayAdapter.ArrayFilter qui nécessite l'accès à un tas d'instances privées de ArrayAdapter.

Quelle est la manière la plus simple de faire ceci?

+0

J'aimerais aussi voir une réponse à cette question. –

+3

J'ai eu le même problème. J'ai fini par écrire un billet sur ce problème et télécharger une implémentation d'adaptateur alternatif. Je laisse le lien pour référence future: http://blogactivity.wordpress.com/2011/08/28/filterable-adapter/ – slezica

Répondre

12

D'abord, jetez un oeil à la source code of ArrayAdapter. Vous remarquerez que le champ privé mFilter est utilisé uniquement dans la méthode getFilter(). Donc, étendez simplement ArrayAdapter et remplacez getFilter() pour renvoyer votre Filter.

Il est préférable de mettre en œuvre votre Filter la même manière que ArrayFilter: en tant que classe intérieure privée, il a accès à des champs privés de ArrayAdapter. Faites-moi savoir si c'est assez d'informations pour terminer la tâche.

+2

Penser à travers cela, aidez-moi à comprendre quelque chose. J'ai examiné la source des classes ArrayAdapter et ArrayFilter internes, et je remarque que ArrayFilter manipule directement les variables de membre privées de ArrayAdapter. Si je comprends bien votre solution, n'aurais-je pas besoin d'implémenter mes propres classes Adapter et Filter? C'est la conclusion à laquelle je suis parvenu moi-même. J'espérais que la prime mènerait à des solutions plus créatives impliquant moins de code personnalisé. Je ne pensais pas que c'était possible, cependant, étant donné que ArrayFilter est privé. –

+0

Merci pour votre suggestion Peter, mais c'est essentiellement la solution que j'espérais éviter. Comme le mentionne yock, il faut copier ou réimplémenter de grandes quantités de code. Je voudrais trouver une solution plus élégante si possible – emmby

+0

Il suffit d'étendre 'ArrayAdapter' et de surcharger' getFilter() '- c'est à peu près 5 lignes de code. Ensuite, vous devez implémenter un 'Filter'. Actuellement ArrayFilter est de 60 lignes de code. Je ne sais pas quel genre de filtrage vous aimeriez faire, mais il sera probablement de longueur similaire. Je peux écrire ceci en moins de 30 minutes, mais cette question est déjà ouverte 3 jours. –