2012-05-23 9 views
9

La documentazione per il metodo getItemPosition nella classe PagerAdapter di Android afferma che si tratta di:Quando dovrebbe getItemPosition prendere in considerazione le modifiche della posizione di un articolo?

Chiamato quando il visualizzazione host sta tentando di determinare se la posizione di un oggetto è cambiato.

Questo metodo deve essere chiamato per indicare se la posizione di un articolo nel gruppo di elementi per tale adattatore è stata modificata o meno.

Tuttavia, non indica mai quando un metodo prioritario deve considerare la posizione da modificare. Significa che la posizione è diversa dalla posizione in cui era stata chiamata l'ultima volta che veniva chiamato getItemPosition? Significa che la posizione dell'oggetto è diversa dall'ultima volta che è stato chiamato notifyDataSetChanged? O significa che la posizione dell'oggetto è diversa da quando l'elemento è stato aggiunto a viewPager?

risposta

11

È possibile vedere in ViewPager.java che getItemPosition è chiamato solo in dataSetChanged. Ciò significa che la posizione dell'oggetto è cambiata se è diversa dall'ultima volta che è stato chiamato dataSetChanged.

Non mi preoccuperei tanto del significato di "cambiato"; ci sono due casi:

  1. La posizione degli elementi aggiunti non cambia mai, quindi getItemPosition rendimenti POSITION_UNCHANGED;
  2. La posizione degli elementi cambia o gli elementi vengono rimossi. Se la posizione dell'articolo non cambia, non vi è alcuna differenza se si restituisce POSITION_UNCHANGED o la posizione effettiva. Quindi, per mantenere la semplice implementazione è possibile restituire la posizione (o POSITION_NONE) e dimenticare POSITION_UNCHANGED ..
7

Per impostazione predefinita, le posizioni di elementi in una ViewPager sono considerati fissi; ecco perché getItemPosition() restituisce per default POSITION_UNCHANGED. Quando sposti un oggetto, ViewPager deve sapere dove rimuovere un oggetto (la vecchia posizione dell'oggetto) e dove aggiungerlo. Questo è quello che viene usato per getItemPosition(). Ti permette di dire al ViewPager quale elemento mettere dove, anche dopo che le tue pagine sono state istanziate.

getItemPosition() viene chiamato solo quando si chiama notifyDataSetChanged() sul PagerAdapter. Con la progettazione ciò significa che "cambiato" significa "cambiato da quando il ViewPager ha popolato le sue pagine", poiché notifyDataSetChanged() fa in modo che ViewPager ridisegni i propri figli laddove necessario. In altre parole: "cambiato" ha uno dei significati che hai citato; qual è il più recente che si verifichi.

Penso che getItemPosition sia abbastanza difficile da capire senza un campione. See my example of how to use getItemPosition(...) here; Penso che chiarirò alcune cose.

Problemi correlati