Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 从未调用ViewPager getItemPosition()。谁该叫它?_Android_Android Fragments - Fatal编程技术网

Android 从未调用ViewPager getItemPosition()。谁该叫它?

Android 从未调用ViewPager getItemPosition()。谁该叫它?,android,android-fragments,Android,Android Fragments,我对片段[State]PagerAdapter有点困惑。基本上,我的问题是需要根据屏幕方向更改ViewPager的内容(片段)。我读了很多关于这个的帖子,有人说我应该覆盖getItemPosition(Object)中的PagerAdapter。我已经这样做了,但是从未调用过该方法,并且在PagerAdapter、FragmentPagerAdapter或FragmentStatePagerAdapter中找不到对它的任何调用。有人知道这是怎么回事,能解释一下吗 目前,我在我的instantia

我对
片段[State]PagerAdapter
有点困惑。基本上,我的问题是需要根据屏幕方向更改
ViewPager
的内容(片段)。我读了很多关于这个的帖子,有人说我应该覆盖
getItemPosition(Object)
中的
PagerAdapter
。我已经这样做了,但是从未调用过该方法,并且在
PagerAdapter
FragmentPagerAdapter
FragmentStatePagerAdapter
中找不到对它的任何调用。有人知道这是怎么回事,能解释一下吗

目前,我在我的
instantiateItem()
中进行了一次丑陋的黑客攻击,以测试我的一个理论,但这并不是我真正想要使用的。如您所见,如果
getItemPosition()
return
POSITION\u 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. public int getItemPosition(对象) 当宿主视图试图确定项目的位置时调用 已经改变了。如果给定的 项目未更改,如果项目不再存在,则位置\u无 在适配器中。 默认实现假定项永远不会被删除 更改位置并始终返回未更改的位置。 @param对象表示一个项的对象,该项以前由对的调用返回 实例化项(视图,int)。 @从[0,getCount())返回对象的新位置索引, 位置\u未更改如果对象的位置未更改, 如果项目不再存在,则定位为“无”。 我已经在API级别19和22上测试了我的代码,问题也是一样的

提前谢谢

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

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
        }
    }
getItemPosition()
仅在调用
notifyDataSetChanged()
后调用

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

我认为您不必做任何类似的事情。当在屏幕方向上重新创建活动时,通常会重新创建PagerAdapter。您只需更改适配器实例化的片段即可。(更新)我认为,
FragmentManager
在rotate上重新创建片段,适配器不会再次重新创建它们。至少当我跟踪代码时,它们不会在rotate上重新创建。我确实扩展了
FragmentPagerAdapter
而不是
PagerAdapter
,可能是后者阻止了片段的自动重新创建。我尝试了
notifyDataSetChanged()
不久前,它没有按预期工作。我想如果我只扩展
PagerAdapter
而不是
Fragment(State)PagerAdapter
,你的解决方案可能会起作用。但是后者会“记住”旋转时的片段,并且永远不会重新创建它们(可能是
FragmentManager
重新创建了它们)。我的印象是
getItemPosition()
会说它是否必须重新创建。我希望我不必编写自己的实例化和销毁代码。:)调用notifyDataSetChange后,它会重新实例化其他视图,这是我不想要的。删除一个视图后,我应该怎么做,以便其他视图保持原样\