getItemPosition什么时候应该考虑项目位置的变化?

时间:2012-05-23 21:25:05

标签: android android-viewpager

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

  

主机视图尝试确定某个项目的位置是否已更改时调用。

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

但是,它永远不会说明何时重写方法应该考虑要改变的位置。这是否意味着该位置与上次调用项目getItemPosition时的位置不同?是否意味着项目的位置与上次调用notifyDataSetChanged不同?或者是否意味着项目的位置与项目添加到viewPager时的位置不同?

2 个答案:

答案 0 :(得分:12)

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

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

  1. 添加的项目的位置永远不会更改,然后getItemPosition会返回POSITION_UNCHANGED;
  2. 项目的位置发生变化,或项目被删除。如果项目位置没有改变,则返回POSITION_UNCHANGED或实际位置没有区别。因此,为了简化实施,您可以返回位置(或POSITION_NONE)并忘记POSITION_UNCHANGED ..

答案 1 :(得分:8)

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

仅当您在PagerAdapter上调用getItemPosition()时,才会调用

notifyDataSetChanged()。根据设计,这意味着“已更改”表示“从ViewPager上次填充其页面时更改”,因为notifyDataSetChanged()会导致ViewPager在必要时重绘其子项。换句话说:“改变”具有你提到的任何含义;无论哪一个是最近发生的。

我认为getItemPosition在没有样本的情况下理解是非常棘手的。 See my example of how to use getItemPosition(...) here;我认为它会澄清一些事情。