【问题标题】:When should getItemPosition consider changes of an item's position?getItemPosition 何时应该考虑项目位置的变化?
【发布时间】:2013-02-12 07:26:20
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: android android-viewpager


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2022-06-11
        • 2020-10-24
        • 2019-04-04
        • 2022-01-17
        • 2010-09-22
        • 1970-01-01
        • 2021-11-08
        • 2019-03-24
        • 1970-01-01
        相关资源
        最近更新 更多