从未调用过ViewPager getItemPosition()。谁应该打电话给它?

时间:2016-01-04 21:06:01

标签: android android-fragments

我对Fragment[State]PagerAdapter感到有些困惑。基本上我的问题是我需要根据屏幕方向更改ViewPager的内容(片段)。我在此阅读了一些帖子,有些人说我应该从getItemPosition(Object)覆盖PagerAdapter。我已经这样做了,但该方法从未被调用过,我无法在PagerAdapterFragmentPagerAdapterFragmentStatePagerAdapter中找到对它的任何调用。那里的任何人都知道这是如何运作的,并且在解释?

目前我在instantiateItem()中制作了一个丑陋的黑客来测试我的理论,但这不是我真正想要使用的。如您所见,如果getItemPosition()返回POSITION_NONE,我会删除该片段。在getItemPosition()中,我有一些逻辑来确定片段是否仍然应该在寻呼机中。

        @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并写了我自己的实例化和销毁方法,我可以解决这个问题。希望我不会有。另外,不理解它很烦人。 ;)

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

在适配器上调用getItemPosition()后调用

notifyDataSetChanged()。这就像是说你要改变ViewPager中的哪些片段。

对于您的情况,如果您在屏幕方向上进行更改,则整个活动可能会被删除并重建,因此只需让适配器做正确的事情即可。用非常简单的术语来说:

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

        if (orientation == ORIENTATION_PORTRAIT) {
            // ... set up the views for portrait
        } else {
            // ... set up the views for landscape
        }
    }