2010-04-19 14 views
14

Tôi có một ArrayAdapter quấn quanh một ArrayList của các đối tượng tùy chỉnh. Tôi muốn viết một bộ lọc tùy chỉnh cho bộ điều hợp đó để khi tôi gọi getListAdapter().getFilter().filter("abc") danh sách sẽ được lọc theo một phép chuyển đổi tùy ý là "abc".Làm cách nào để ghi đè bộ lọc trong ArrayAdapter của Android?

Tôi nghĩ mình sẽ cố gắng ghi đè lên ArrayAdapter.getFilter(), nhưng điều đó yêu cầu tôi triển khai lại ArrayAdapter.ArrayFilter riêng yêu cầu quyền truy cập vào một loạt các cá thể riêng của ArrayAdapter.

Cách đơn giản nhất để thực hiện việc này là gì?

+0

Tôi cũng rất muốn xem câu trả lời cho câu hỏi này. –

+3

Tôi gặp vấn đề tương tự. Tôi đã kết thúc viết một bài đăng blog về vấn đề này và tải lên một triển khai bộ điều hợp thay thế. Tôi rời khỏi liên kết để tham khảo trong tương lai: http://blogactivity.wordpress.com/2011/08/28/filterable-adapter/ – slezica

Trả lời

12

Trước tiên, hãy xem source code of ArrayAdapter.

Bạn sẽ nhận thấy rằng trường có trường riêng tư mFilter chỉ được sử dụng trong phương thức getFilter(). Vì vậy, chỉ cần mở rộng ArrayAdapter và ghi đè getFilter() để trả lại Filter của bạn.

Tốt nhất là nên thực hiện Filter theo cùng một cách như bạn ArrayFilter: như lớp bên tư nhân, vì vậy nó có quyền truy cập vào các lĩnh vực riêng của ArrayAdapter.

Hãy cho tôi biết nếu điều này là đủ thông tin để hoàn thành tác vụ.

+2

Suy nghĩ qua điều này, giúp tôi hiểu điều gì đó. Tôi đã kiểm tra nguồn của các lớp ArrayAdapter và lớp ArrayFilter bên trong, và tôi nhận thấy rằng ArrayFilter trực tiếp thao tác các biến thành viên riêng của ArrayAdapter. Nếu tôi hiểu chính xác giải pháp của bạn, tôi có cần phải triển khai các lớp Bộ lọc và Bộ lọc của riêng mình không? Đây là kết luận tôi tự mình làm. Tôi đã hy vọng tiền thưởng sẽ dẫn đến các giải pháp sáng tạo hơn có liên quan đến mã tùy chỉnh ít hơn. Tôi không nghĩ rằng điều này là có thể, tuy nhiên, cho rằng ArrayFilter là riêng tư. –

+0

Cảm ơn đề xuất của bạn Peter, nhưng đó thực chất là giải pháp mà tôi hy vọng sẽ tránh được. Như yock đề cập, nó đòi hỏi phải sao chép hoặc reimplementing số lượng lớn mã. Tôi muốn tìm một giải pháp thanh lịch hơn nếu có thể – emmby

+0

Bạn chỉ phải mở rộng 'ArrayAdapter' và ghi đè' getFilter() '- đó là khoảng 5 dòng mã. Sau đó, bạn phải thực hiện một 'Bộ lọc'. Hiện tại ArrayFilter là 60 dòng mã. Tôi không biết bạn muốn làm loại lọc nào nhưng có lẽ nó sẽ có độ dài tương tự. Tôi có thể viết điều này trong chưa đầy 30 phút, nhưng câu hỏi này đã được mở 3 ngày. –