2012-05-23 13 views
9

Dokumentacja dla getItemPosition metoda w klasie PagerAdapter Android stwierdza, że:Kiedy należy uzyskaćItemPosition rozważyć zmiany pozycji pozycji?

Wywoływana, gdy widok gospodarz stara się ustalić, czy pozycja pozycja uległa zmianie.

Ta metoda ma zostać wywołana w celu wskazania, czy pozycja elementu w grupie elementów dla tego adaptera uległa zmianie.

Jednak nigdy nie stwierdza, czy nadrzędna metoda powinna uwzględniać pozycję do zmiany. Czy to znaczy, że pozycja jest inna niż pozycja, w której był ostatnio wywoływany element getItemPosition? Czy to znaczy, że pozycja przedmiotu jest inna niż ostatnio wywołano funkcję notifyDataSetChanged? Czy to znaczy, że pozycja przedmiotu jest inna niż pozycja dodana do podglądu?

Odpowiedz

11

Możesz zobaczyć w ViewPager.java, że ​​getItemPosition jest wywoływana tylko w dataSetChanged. Oznacza to, że pozycja przedmiotu uległa zmianie, jeśli jest inna niż w ostatnim czasie, w którym został wywołany dataSetChanged.

Nie martwiłbym się zbytnio o znaczenie "zmienionego"; istnieją dwa przypadki:

  1. Stanowisko dodanych elementów nigdy się nie zmienia, a następnie getItemPosition powraca POSITION_UNCHANGED;
  2. Pozycja elementów ulega zmianie lub elementy są usuwane. Jeśli pozycja pozycji się nie zmieniła, nie ma różnicy, jeśli zwrócisz POSITION_UNCHANGED lub rzeczywistą pozycję. Tak aby utrzymać prosta implementacja można powrócić do pozycji (lub POSITION_NONE) i zapomnieć o POSITION_UNCHANGED ..
7

Domyślnie pozycje elementów w ViewPager są uważane za stałe; właśnie dlatego getItemPosition() domyślnie zwraca POSITION_UNCHANGED. Kiedy przenosisz przedmiot dookoła, ViewPager musi wiedzieć, gdzie usunąć przedmiot (stare położenie przedmiotu) i gdzie go dodać. Właśnie do tego służy getItemPosition(). To pozwala ci poinformować ViewPager, który element umieścić w miejscu, nawet po utworzeniu twoich stron.

getItemPosition() jest wywoływana tylko po wywołaniu notifyDataSetChanged() na swoim PagerAdapter. Z założenia oznacza to, że "zmieniony" oznacza "zmieniony, gdy program ViewPager ostatnio zapełnił swoje strony", ponieważ powoduje, że ViewPager przerysowuje swoje dzieci tam, gdzie jest to konieczne. Innymi słowy: "zmieniony" ma dowolne ze znaczeń, o których wspomniałeś; w zależności od tego, która z nich jest ostatnia.

Myślę, że getItemPosition jest dość trudny do zrozumienia bez próbki. See my example of how to use getItemPosition(...) here; Myślę, że to wyjaśni pewne rzeczy.

Powiązane problemy