2011-07-03 31 views
9

Tôi đang làm việc trên một ứng dụng Android có listView và đang trong quá trình tối ưu hóa nó. Nó sử dụng một bộ điều hợp con trỏ tùy chỉnh trong một hoạt động và tôi nhận thấy rằng bindview() được kích hoạt hai lần cho mỗi hàng trong danh sách. Trong khi nghiên cứu các phương thức BindView() và NewView() ở đây, tôi đọc trong một bài viết có Wrap_Content cho chiều rộng của listview của tôi là một ý tưởng tồi. Tôi chuyển nó sang Fill_Parent và viola bây giờ bindview() và newview() mỗi cái chỉ cháy một lần cho mỗi mục.Tại sao Wrap_Content cháy BindView nhiều hơn một lần

Vì vậy mà tôi có thể hiểu rõ hơn về nội bộ của hệ điều hành Andorid, tôi muốn biết tại sao Wrap_Content gây ra bindview() để bắn nhiều lần.

Tôi đã thực hiện một số tìm kiếm trên Google, tài liệu dành cho nhà phát triển Android và tại đây không có may mắn.

Bất kỳ phản hồi nào thực sự được đánh giá cao.

Cảm ơn, George

Trả lời

10

Nếu tôi nhớ chính xác từ một đoạn video từ Google I/O, thiết lập chiều rộng (hoặc chiều cao) của một ListView-wrap_content sẽ gây ra nó để đo 3 mục đầu tiên và căn kích thước của nó tắt của những người. Để đo 3 mặt hàng đầu tiên, nó phải gọi bindView() để điền chúng. Một khi nó đã được đo, nó sẽ cư trú đầy đủ và gọi lại là bindView() vào 3 đầu tiên đó và bất kỳ lần tiếp theo nào.

Điều này là do thực tế rằng ListView chỉ lưu trong bộ nhớ những gì có trên màn hình khi bạn có thể có khả năng vô số mục trong danh sách. Nó không được thiết kế để wrap_content vào mục lớn nhất của bạn bởi vì nó có thể bị mắc kẹt trong giai đoạn vẽ mãi mãi.

+2

Đúng, tôi đã trả lời [câu hỏi] tương tự (http://stackoverflow.com/questions/6557240/expandablelist-getchildview-running-twice-per-child/6557284#6557284) hôm qua. Video/thời gian được cung cấp ở đó. – dmon

+1

Vâng, điều này là chính xác. ListView đôi khi sẽ gọi getView của adapter của bạn cho mục đích đo lường. Không có đảm bảo rằng kết quả của bất kỳ cuộc gọi nào đến getView sẽ được đặt trên màn hình hoặc lệnh gọi getView gần đây nhất có liên quan đến những gì hiện đang được hiển thị. – adamp

+0

Cảm ơn bạn đã trả lời Glendon. Chính xác những gì tôi đang tìm kiếm. –

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