2010-04-19 10 views
14

Ich habe ein ArrayAdapter um eine ArrayList von benutzerdefinierten Objekten gewickelt. Ich möchte einen benutzerdefinierten Filter für diesen Adapter schreiben, so dass beim Aufruf getListAdapter().getFilter().filter("abc") die Liste durch eine beliebige Transformation von "abc" gefiltert wird.Wie überschreibt man Filter in Android ArrayAdapter?

Ich dachte, ich würde einfach versuchen, ArrayAdapter.getFilter() zu überschreiben, aber das erfordert, dass ich die private ArrayAdapter.ArrayFilter re-implementieren, die Zugriff auf eine Reihe von ArrayAdapter privaten Instanzen benötigt.

Was ist der einfachste Weg, dies zu tun?

+0

Ich würde auch gerne eine Antwort auf diese Frage sehen. –

+3

Ich hatte das gleiche Problem. Am Ende habe ich einen Blogbeitrag zu diesem Problem geschrieben und eine alternative Adapterimplementierung hochgeladen. Ich lasse den Link für die zukünftige Referenz: http://blogactivity.wordpress.com/2011/08/28/filterable-adapter/ – slezica

Antwort

12

Zuerst werfen Sie einen Blick auf die source code of ArrayAdapter.

Sie werden feststellen, dass es private Feld mFilter hat, die nur in getFilter() Methode verwendet wird. Erweitern Sie einfach ArrayAdapter und überschreiben Sie getFilter(), um Ihre Filter zurückzugeben.

Am besten implementieren Sie Ihre Filter die gleiche Weise wie ArrayFilter: als private innere Klasse, so hat es Zugriff auf private Felder von ArrayAdapter.

Lassen Sie mich wissen, ob dies ausreicht, um die Aufgabe zu vervollständigen.

+2

Denken Sie dabei, helfen Sie mir etwas zu verstehen. Ich habe die Quelle der ArrayAdapter und inneren ArrayFilter-Klassen untersucht, und ich stelle fest, dass ArrayFilter die privaten Elementvariablen von ArrayAdapter direkt bearbeitet. Wenn ich Ihre Lösung richtig verstehe, müsste ich nicht meine eigenen Adapter- und Filterklassen implementieren? Zu diesem Schluss kam ich alleine. Ich hatte gehofft, dass das Kopfgeld zu kreativeren Lösungen mit weniger benutzerdefiniertem Code führen würde. Ich dachte jedoch nicht, dass dies möglich ist, da ArrayFilter privat ist. –

+0

Vielen Dank für Ihren Vorschlag Peter, aber das ist im Wesentlichen die Lösung, die ich vermeiden wollte. Wie yock erwähnt, erfordert es das Kopieren oder die Neuimplementierung großer Mengen an Code. Ich würde gerne eine elegantere Lösung finden, wenn möglich – emmby

+0

Sie müssen nur 'ArrayAdapter' erweitern und' getFilter() 'überschreiben - das sind etwa 5 Zeilen Code. Dann müssen Sie einen 'Filter' implementieren. Gegenwärtig besteht ArrayFilter aus 60 Codezeilen. Ich weiß nicht, welche Art von Filterung du gerne machen würdest, aber es wird wahrscheinlich von ähnlicher Länge sein. Ich kann das in weniger als 30 Minuten schreiben, aber diese Frage ist schon 3 Tage offen. –

Verwandte Themen