2010-04-19 5 views
14

Tengo un ArrayAdapter alrededor de una ArrayList de objetos personalizados. Me gustaría escribir un filtro personalizado para ese adaptador para que cuando llame al getListAdapter().getFilter().filter("abc") la lista se filtre mediante una transformación arbitraria de "abc".¿Cómo anular el filtro en el ArrayAdapter de Android?

Pensé que simplemente trataría de sobreescribir ArrayAdapter.getFilter(), pero eso requiere que vuelva a implementar el ArrayAdapter.ArrayFilter privado que requiere acceso a un montón de instancias privadas de ArrayAdapter.

¿Cuál es la forma más sencilla de hacerlo?

+0

También me gustaría ver una respuesta a esta pregunta. –

+3

Tuve el mismo problema. Terminé escribiendo una publicación de blog sobre este tema y cargando una implementación de adaptador alternativo. Dejo el enlace para referencia futura: http://blogactivity.wordpress.com/2011/08/28/filterable-adapter/ – slezica

Respuesta

12

Primero, eche un vistazo al source code of ArrayAdapter.

Notará que tiene el campo privado mFilter que solo se usa en el método getFilter(). Por lo tanto, solo extienda ArrayAdapter y anule getFilter() para devolver su Filter.

Lo mejor es implementar su Filter de la misma manera que ArrayFilter: como clase privada interna, por lo que tiene acceso a campos privados de ArrayAdapter.

Quiero saber si esto es información suficiente para completar la tarea.

+2

Pensando en esto, ayúdame a entender algo. He examinado la fuente de las clases ArrayAdapter y ArrayFilter internas, y noté que ArrayFilter manipula directamente las variables de miembro privado de ArrayAdapter. Si entiendo su solución correctamente, ¿no necesitaría implementar mis propias clases de Adaptador y Filtro? Esta es la conclusión a la que vine por mi cuenta. Esperaba que la recompensa llevara a más soluciones creativas que implicaran menos código personalizado. No pensé que esto fuera posible, sin embargo, dado que ArrayFilter es privado. –

+0

Gracias por su sugerencia Peter, pero esa es esencialmente la solución que esperaba evitar. Como lo menciona Yock, se requiere copiar o volver a implementar grandes cantidades de código. Me gustaría encontrar una solución más elegante si es posible – emmby

+0

Solo tiene que extender 'ArrayAdapter' y anular' getFilter() '- eso es como 5 líneas de código. Luego tienes que implementar un 'Filtro'. Actualmente ArrayFilter tiene 60 líneas de código. No sé qué tipo de filtro desearía hacer, pero probablemente sea de una duración similar. Puedo escribir esto en menos de 30 minutos, pero esta pregunta ya está abierta 3 días. –

Cuestiones relacionadas