2012-12-13 49 views
5

Trong khi viết bộ điều hợp riêng của tôi mở rộng lớp ArrayAdapter, tôi đã gặp các nhà xây dựng khác nhau có sẵn và tôi nhận thấy rằng tất cả đều yêu cầu tham số textViewResourceId. Vì vậy, ban đầu, tôi quyết định rằng tôi sẽ ăn lớp bộ chuyển đổi tùy chỉnh của tôi android.R.id.text1:Đối số textViewResourceId có cần thiết không?

MyAdapter adapter = new MyAdapter(this, R.layout.myRow, android.R.id.text1); 

Tuy nhiên, sau này trong quá trình phát triển của tôi, tôi quyết định ghi đè getView phương pháp mà tôi sẽ

TextView label = (TextView) myRow.findViewById(android.R.id.text1); 
label.setText("Position #" + position); 

Làm việc tốt. Nhưng sau đó câu hỏi này đến với tâm trí: nếu tôi đang làm logic để làm thế nào để hiển thị hàng, là nó thực sự cần thiết để cung cấp một văn bản textViewResourceId cho nhà xây dựng khi tôi bắt đầu adapter tùy chỉnh của tôi? Hoặc là trường hợp khi bạn ghi đè getView, thông số đó không còn cần thiết nữa? Nếu suy nghĩ của tôi là chính xác, thực hành phổ biến cho instantiating các adapter biết rằng bạn sẽ được trọng các hành vi hiển thị anyways là gì?

Trả lời

9

Nếu bạn đang trọng getView bạn làm KHÔNG cần phải xác định một hợp textViewResourceId .. Bạn có thể vượt qua trong 0. Lần duy nhất ArrayAdapter cố gắng để truy cập vào ID đó là trong vòng getView .. Vì bạn đang trọng getView và cung cấp Nếu bạn không muốn truy cập vào một lớp ID nào đó thì bạn vẫn cần chuyển ID xem thành siêu cuộc gọi .. tuy nhiên, nó có thể là 0 vì nó sẽ không bao giờ được sử dụng

ArrayAdapter Source confirming all of this

Nếu bạn không chỉ định thích hợp textViewResourceId và không ghi đè getView .. getView trong ArrayAdapter giả định toàn bộ quan điểm của bạn là một TextView .. Nếu nhìn của bạn không phải là một TextView .. bạn sẽ kết thúc với tai nạn từ một ClassCastException ..

+0

(upvote) Thay vì vượt qua 0, tôi sẽ sử dụng một hàm tạo không yêu cầu 'textViewResouceId'. – Sam

+0

@Sam - Nếu bạn muốn sử dụng ArrayAdapter, bạn cần truyền nó cho textViewResourceId. Không tránh được điều đó vì nó mong đợi nó (ngay cả khi nó không hợp lệ). Bạn có thể sao chép mã nguồn và viết lại ArrayAdapter để nó không yêu cầu textViewResourceId. Tuy nhiên, chỉ đơn giản là tránh đi qua một int duy nhất của nó không thực sự giá trị nó. – dymmeh

+0

@Sam - Hoặc bạn có thể tạo Bộ điều hợp của riêng bạn để mở rộng BaseAdapter. Bạn sẽ không có được xử lý mảng được xây dựng, do đó bạn sẽ cần phải làm điều đó cho mình. Tuy nhiên, bạn có thể tùy chỉnh nó nhiều như bạn muốn và xây dựng trong các tính năng cơ bản của xử lý mảng – dymmeh

0

bạn không cần sử dụng bất kỳ loại xây dựng nào trong bộ điều hợp.

bạn có thể kéo dài tuổi BaseAdapter và làm cho quy tắc riêng của mình về những gì thể hiện, loại dữ liệu để tổ chức vv ...

trên thực tế, tôi hầu như không bao giờ sử dụng được xây dựng trong adapter rằng Android đã ra khỏi , vì việc sử dụng baseAdapter rất dễ dàng.

Các vấn đề liên quan