1

我有一个有 10 多个视图的 ViewPager。我希望偶尔更改页面的顺序,即

第 1 页 | 第 2 页 | 第 3 页

第 3 页 | 第 1 页 | 第2页

对于我使用ViewPagerIndicator的选项卡,我可以通过更改适配器的顺序并调用来更新它们的顺序:

mViewPagerIndicator.notifyDataSetChanged();

但是,我无法更新的是 ViewPager 的内容,例如,如果我更新 ViewPager 适配器(到我希望页面所在的新顺序)并调用:

mViewPager.getAdapter().notifyDataSetChanged()

这没有效果。标签指示栏更新正常,但页面内容仍显示旧顺序。

有没有办法改变 ViewPager 适配器中的页面顺序并让 ViewPager 重新加载它的所有视图?


我的 ViewPager 适配器扩展FragmentStatePagerAdapter,我的重写方法如下:

@Override
public Fragment getItem(int position) {
    return MyCustomFragment.newInstance();
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    //super.destroyItem(container, position, object);  // Commented out to ensure views are not destroyed
}

谢谢

4

2 回答 2

1

这很棘手,FragmentStatePagerAdapter因为您必须自己实现逻辑,但是FragmentPagerAdapter已经为此目的提供了功能要容易得多。

调用.notifyDataSetChanged()调用getItemPosition(Object object)适配器的 - 方法。这是您应该向 ViewPager 提供在参数中传递的 Fragment 放置位置的信息,方法object是返回您希望放置 Fragment 的页码。

有关如何执行此操作的示例,请在此处查看我的答案

于 2013-02-11T23:34:04.747 回答
0

如果性能不是非常重要,那么强制FragmentStatePagerAdapterFragmentPagerAdapter重绘(无效)其所有视图/片段真的很容易:只需像往常一样覆盖getItemPosition和调用。notifyDataSetChanged()

@Override
public int getItemPosition(Object object) {
    return POSITION_NONE; //In source code, POSITION_NONE = -2 FYI
}

有关更多信息,请查看我的帖子:如何以降序而不是升序使用 orderByKey() #Askfirebase

于 2016-07-29T23:26:25.620 回答