ViewPager 切换 FragmentPagerAdapter

6
我有一个由FragmentPagerAdapter填充的ViewPager。我想从第一个适配器更改为另一个适配器。问题在于,在拥有第一个适配器时加载的所有页面仍然是旧的。
我查看了FragmentPagerAdapter的源代码,猜测问题出现在instatiateItem()方法的实现上。使用包含位置和容器ID的标记,该方法检查在该位置是否已经存在Fragment。当存在带有此标记的Fragment时,它会被附加。设置新适配器时,容器ID和位置不会改变,因此它会找到旧的Fragment
您知道删除所有旧片段的方法吗?
1个回答

11

我意识到 Fragment 标签使用由 getItemId() 获得的 id,而不是位置。为了解决我的问题,我已经重写了 getItemId() 并在不同的 FragmentPagerAdapter 中使用完全不同的 id。

@Override
public long getItemId(int position) {
    return mPagerId*100+position;
}

mPagerId是一个在构造函数中分配的唯一整数。如果您有超过100个页面,应该将100替换为1000。


@AntonM。它在安卓2.2的HTC Legend上运行得非常好,谢谢Gabriel。 - Ali
1
很不幸,这个解决方案会导致内存泄漏,因为所有之前的页面片段都会留在片段管理器中的内存中 - 您可以通过使用getFragmentSupportManager().getFragments()轻松检查。 生成新的ID只会强制PagerAdapter创建新的页面,而不会删除旧ID的页面... - Nati Dykstein

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接