2010-04-19 2 views
14

사용자 지정 개체의 ArrayList 주위에 래핑 된 ArrayAdapter가 있습니다. 해당 어댑터에 대한 사용자 지정 필터를 작성하여 getListAdapter().getFilter().filter("abc")을 호출하면 목록이 "abc"의 임의 변환에 의해 필터링됩니다.android의 ArrayAdapter에서 필터를 재정의하는 방법은 무엇입니까?

나는 단지 ArrayAdapter.getFilter()을 무시하려고한다고 생각했지만, 그 경우에는 ArrayAdapter.ArrayFilter 전용 ArrayAdapter의 개인 인스턴스에 대한 액세스가 필요한 개인용을 다시 구현해야합니다.

가장 간단한 방법은 무엇입니까?

+0

나는 또한이 질문에 대한 답변을보고 싶습니다. –

+3

나는 똑같은 문제가 있었다. 나는이 문제에 관한 블로그 포스트를 작성하고 대체 어댑터 구현을 업로드하는 일을 마쳤다. 나중에 참조 할 수 있도록 링크를 남겨 두었습니다. http://blogactivity.wordpress.com/2011/08/28/filterable-adapter/ – slezica

답변

12

먼저 source code of ArrayAdapter을 살펴보십시오.

방법에서만 사용되는 개인 필드 mFilter이 있다는 것을 알게 될 것입니다. 그러므로 ArrayAdapter을 연장하고 getFilter()을 재정의하여 Filter을 반환하십시오.

FilterArrayFilter : 개인 내부 클래스로 구현하여 ArrayAdapter의 비공개 필드에 액세스 할 수 있도록하는 것이 가장 좋습니다.

이 작업을 완료하는 데 충분한 정보인지 알려주세요.

+2

이것을 생각하면서 뭔가 이해할 수있게 도와주세요. 나는 ArrayAdapter와 내부 ArrayFilter 클래스의 소스를 조사했고 ArrayAdapter의 private 멤버 변수를 ArrayFilter가 직접 조작한다는 것을 알았습니다. 솔루션을 올바르게 이해했다면 자체 어댑터 및 필터 클래스를 구현할 필요가 없습니까? 이것이 내가 혼자 온 결론입니다. 나는 현상금이 더 적은 주문 코드를 포함하는 창조적 인 해결책으로 이끌 것이기를 바랬다. 그러나 ArrayFilter가 비공개라는 점을 감안할 때 이것이 가능하다고 생각하지는 않았습니다. –

+0

Peter에게 제안 해 주셔서 감사합니다.하지만 필자가 피하고자했던 해결책입니다. 요크가 언급하기 때문에 많은 양의 코드를 복사하거나 다시 구현해야합니다. 가능하다면 좀 더 우아한 해결책을 찾고 싶습니다. – emmby

+0

'ArrayAdapter'를 확장하고'getFilter()'를 오버라이드하면됩니다. 약 5 줄의 코드입니다. 그런 다음 '필터'를 구현해야합니다. 현재 ArrayFilter는 60 줄의 코드입니다. 어떤 종류의 필터링을하고 싶은지 모르겠지만 아마 비슷한 길이가 될 것입니다. 나는 30 분 안에 이것을 쓸 수있다. 그러나이 질문은 이미 3 일 동안 열려있다. –