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()
returnPOSITION\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后,它会重新实例化其他视图,这是我不想要的。删除一个视图后,我应该怎么做,以便其他视图保持原样\