【发布时间】:2016-01-04 21:06:00
【问题描述】:
我对@987654321@ 有点疑惑。基本上我的问题是我需要根据屏幕方向更改ViewPager 的内容(片段)。我阅读了许多关于此的帖子,有人说我应该从PagerAdapter 覆盖getItemPosition(Object)。我已经这样做了,但是从未调用过该方法,并且在PagerAdapter、FragmentPagerAdapter 和FragmentStatePagerAdapter 中找不到任何调用它的方法。有谁知道这是如何工作的并介意解释一下吗?
目前我在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) 当宿主视图试图确定一个项目的位置时调用 已经改变。如果给定的位置返回 POSITION_UNCHANGED 项目未更改或 POSITION_NONE 如果项目不再存在 在适配器中。默认实现假定项目永远不会 更改位置并始终返回 POSITION_UNCHANGED。 @param object 表示项目的对象,之前通过调用返回 实例化项目(视图,int)。 @return 对象的新位置索引来自 [0, getCount()), POSITION_UNCHANGED 如果对象的位置没有改变, POSITION_NONE 如果项目不再存在。
我在 API 级别 19 和 22 上测试了我的代码,问题是一样的。
提前致谢。
编辑:我扩展FragmentStatePagerAdapter 或FragmentPagerAdapter。如果我扩展 PagerAdapter 并编写自己的实例化和销毁方法,我也许可以解决这个问题。希望我不会有太多。再加上看不懂很烦。 ;)
【问题讨论】:
-
我认为您不必这样做。当在屏幕方向上重新创建 Activity 时,通常会重新创建 PagerAdapter。相反,您只需更改适配器实例化的片段。
-
(更新)我认为
FragmentManager在旋转时重新创建片段,并且适配器不会再次重新创建它们。至少当我跟踪代码时,它们不会在旋转时重新创建。我确实扩展了FragmentPagerAdapter而不是PagerAdapter,可能是后者阻止了片段的自动重新创建。