2012-05-23 28 views
9

Các tài liệu cho getItemPosition phương thức trong lớp PagerAdapter Android nói rằng nó là:Khi nào getItemPosition nên xem xét các thay đổi về vị trí của một mục?

gọi khi xem máy chủ đang cố gắng xác định xem vị trí của một mục đã thay đổi.

Phương pháp này được cho là được gọi để cho biết vị trí của mục trong nhóm các mục của bộ điều hợp đó đã thay đổi hay chưa.

Tuy nhiên, nó không bao giờ nêu rõ khi phương pháp ghi đè nên xem xét vị trí cần thay đổi. Nó có nghĩa là vị trí khác với vị trí trong lần cuối cùng mà mục getItemPosition được gọi? Điều đó có nghĩa là vị trí của mục khác với thông báo thời gian quaDataSetChanged được gọi? Hay nó có nghĩa là vị trí của item khác với khi item được thêm vào viewPager?

Trả lời

11

Bạn có thể thấy trong ViewPager.java rằng getItemPosition chỉ được gọi trong số dataSetChanged. Điều này có nghĩa là vị trí của mục đã thay đổi nếu nó khác với lần cuối cùng dataSetChanged được gọi.

Tôi sẽ không lo lắng nhiều về ý nghĩa của "thay đổi"; có hai trường hợp:

  1. Vị trí của các mục được thêm vào không bao giờ thay đổi, sau đó getItemPosition trả về POSITION_UNCHANGED;
  2. Vị trí của các mục thay đổi hoặc các mục sẽ bị xóa. Nếu vị trí mục không thay đổi, không có sự khác biệt nếu bạn trả lại POSITION_UNCHANGED hoặc vị trí thực tế. Vì vậy, để giữ cho việc thực hiện đơn giản, bạn có thể trở lại vị trí (hoặc POSITION_NONE) và quên đi POSITION_UNCHANGED ..
7

Theo mặc định, vị trí của các mục trong một ViewPager được coi là cố định; đó là lý do tại sao getItemPosition() theo mặc định trả về POSITION_UNCHANGED. Khi bạn di chuyển một mục xung quanh, ViewPager phải biết nơi để loại bỏ một mục (vị trí cũ của mục) và nơi để thêm nó. Đây là những gì getItemPosition() được sử dụng cho. Nó cho phép bạn nói cho ViewPager biết mục nào sẽ đặt ở đâu, ngay cả sau khi các trang của bạn đã được khởi tạo.

getItemPosition() chỉ được gọi khi bạn gọi notifyDataSetChanged() trên PagerAdapter của mình. Bằng cách thiết kế này có nghĩa là "thay đổi" có nghĩa là "thay đổi từ khi ViewPager cuối cùng cư trú các trang của nó", như notifyDataSetChanged() làm cho ViewPager vẽ lại con của nó khi cần thiết. Nói cách khác: "thay đổi" có một trong những ý nghĩa bạn đã đề cập; bất kỳ cái nào xảy ra gần đây nhất.

Tôi nghĩ rằng getItemPosition khá khó hiểu nếu không có mẫu. See my example of how to use getItemPosition(...) here; Tôi nghĩ rằng nó sẽ làm rõ một số điều.

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