android - ViewPager getItemPosition() 从未调用过。谁应该调用它?

标签 android android-fragments

我对 Fragment[State]PagerAdapter 有点疑惑。基本上我的问题是我需要根据屏幕方向更改 ViewPager 的内容( fragment )。我阅读了很多关于此的帖子,有些人说我应该覆盖 PagerAdapter 中的 getItemPosition(Object)。我已经这样做了,但是从未调用过该方法,而且我在 PagerAdapterFragmentPagerAdapterFragmentStatePagerAdapter 中都找不到对它的任何调用。那里有人知道这是如何工作的并且介意解释一下吗?

目前我在我的 instantiateItem() 中做了一个丑陋的 hack 来测试我的理论,但这并不是我真正想要使用的。如您所见,如果 getItemPosition() 返回 POSITION_NONE,我将删除 fragment 。在 getItemPosition() 中,我有一些逻辑来确定 fragment 是否仍应位于寻呼机中。

        @Override
        public Object instantiateItem(ViewGroup container, int position) {

            // Hack since getItemPosition is never called.
            final long itemId = getItemId(position);
            String name = makeFragmentName(container.getId(), itemId);
            Fragment fragment = mFragmentManager.findFragmentByTag(name);
            if(fragment != null && getItemPosition(fragment) == POSITION_NONE) {
                mFragmentManager.beginTransaction().remove(fragment).commit();
                mFragmentManager.executePendingTransactions();
            }

            fragment = (Fragment) super.instantiateItem(container, position);
            registeredFragments.put(position, fragment);
            return fragment;
        }

JavaDoc 说:

public int getItemPosition(Object object)

Called when the host view is attempting to determine if an item's position
has changed. Returns POSITION_UNCHANGED if the position of the given
item has not changed or POSITION_NONE if the item is no longer present
in the adapter.

The default implementation assumes that items will never change position and always returns POSITION_UNCHANGED. @param object Object representing an item, previously returned by a call to instantiateItem(View, int). @return object's new position index from [0, getCount()), POSITION_UNCHANGED if the object's position has not changed, POSITION_NONE if the item is no longer present.

我已经在 API 级别 19 和 22 上测试了我的代码,问题是一样的。

提前致谢。

编辑:我扩展了 FragmentStatePagerAdapterFragmentPagerAdapter。如果我扩展 PagerAdapter 并编写自己的实例化和销毁方法,我也许可以解决这个问题。希望我不会有太多。另外,不理解它很烦人。 ;)

最佳答案

getItemPosition() 仅在 notifyDataSetChanged() 调用后调用。

因此,首先修改您的数据集,然后调用 notifyDataSetChanged()。 您还必须覆盖 getItemId() 以返回静态标识符。默认情况下,它返回给定的位置。

关于android - ViewPager getItemPosition() 从未调用过。谁应该调用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34599837/

相关文章:

java - 元素不会在 Constraintlayout Android Studio 中正确居中

java - 所选值保留保存在带有单选按钮 Android 的 Dialogfragment 中

android - 重置/重新加载 fragment 容器

android - 带有 pagerview fragment 的选项卡

android - 带工具栏的 Viewpager

java - 无法更新 View Pager 中的中间 fragment 。

android - 为什么 "Circular dependencies cannot exist in RelativeLayout"会发生这种情况?

java - "Validates resource references inside Android XML files"

java - android中2个 View 之间的碰撞

android - 该效果的名称/重现方法