11

Android 的 PagerAdapter 类中方法 getItemPosition 的文档说明它是:

当宿主视图试图确定项目的位置是否已更改时调用。

应该调用此方法来指示该适配器的项目组中项目的位置是否已更改。

但是,它从不说明覆盖方法何时应考虑更改位置。这是否意味着该位置与上次调用项目 getItemPosition 时的位置不同?这是否意味着该项目的位置与上次调用 notifyDataSetChanged 不同?或者这是否意味着该项目的位置与该项目添加到 viewPager 时的位置不同?

4

2 回答 2

13

您可以在 ViewPager.java 中看到getItemPosition仅在dataSetChanged. 这意味着如果项目的位置与上次dataSetChanged调用时不同,则它的位置会发生变化。

我不会太担心“改变”的含义;有两种情况:

  1. 添加的项目的位置永远不会改变,然后getItemPosition返回POSITION_UNCHANGED
  2. 项目的位置发生变化,或项目被删除。如果物品位置没有变化,则返回POSITION_UNCHANGED或实际位置没有区别。因此,为了保持实现简单,您可以返回位置(或POSITION_NONE)并忘记POSITION_UNCHANGED..
于 2012-06-20T22:03:20.207 回答
8

默认情况下,ViewPager 中项目的位置被认为是固定的;这就是为什么getItemPosition()默认返回POSITION_UNCHANGED. 当你移动一个项目时,ViewPager 必须知道在哪里移除一个项目(项目的旧位置)以及在哪里添加它。这就是getItemPosition()用途。它允许您告诉 ViewPager 将哪个项目放在哪里,即使在您的页面已经实例化之后也是如此。

getItemPosition()仅在您调用notifyDataSetChanged()PagerAdapter 时调用。通过设计,这意味着“更改”意味着“从 ViewPager 上次填充其页面时发生更改”,因为这notifyDataSetChanged()会导致 ViewPager 在必要时重新绘制其子项。换句话说:“改变”具有您提到的任何一种含义;以最近发生的为准。

我认为getItemPosition没有样本很难理解。在此处查看我的使用示例getItemPosition(...);我想它会澄清一些事情。

于 2013-02-11T23:26:20.213 回答