Android在FragmentPagerAdapter中更改片段顺序

Ruu*_*kis 2 java android android-fragments android-viewpager fragmentpageradapter

我在FragmentPagerAdapter中有大约20个片段,它们包含一个列表,它从中拾取片段,因此不会重新创建片段.

private List<TitledFragment> fragments;

public SectionsPagerAdapter(FragmentManager fm) {
    super(fm);

    this.fragments = new ArrayList<TitledFragment>();
}

@Override
public Fragment getItem(int i) {
    return fragments.get(i).getFragment();
}

@Override
public int getCount() {
    return fragments.size();
}

@Override
public CharSequence getPageTitle(int position) {
   return fragments.get(position).getTitle();
}

public synchronized List<TitledFragment> getFragments() {
    return fragments;
}


public synchronized void addFragment(TitledFragment fragment) {
    fragments.add(fragment);
    notifyDataSetChanged();
}
Run Code Online (Sandbox Code Playgroud)

FragmentPagerAdapter被设置为ViewPager的适配器,之后我重新排序片段(洗牌仅用于测试)

Collections.shuffle(mSectionsPagerAdapter.getFragments());
mSectionsPagerAdapter.notifyDataSetChanged();
Run Code Online (Sandbox Code Playgroud)

由于某种原因,只有标题的顺序被改变,即使它为getItem返回不同的片段,因为顺序是不同的.为什么这样,我怎么能绕过它呢?

Ugg*_*dle 9

你还需要覆盖getItemPosition().默认情况下,此函数始终返回POSITION_UNCHANGED,因此在调用时notifyDataSetChanged(),适配器会假定所有片段仍处于相同位置.(它不再调用getItem(),因为它认为已经创建了所有必需的片段.)你的新getItemPosition()应该在洗牌后返回每个片段的新位置.

一个简单的黑客就是总是返回POSITION_NONE,然后适配器将丢弃所有现有的片段,并在调用时在正确的位置重新创建它们getItem().当然,这不是有效的,并且具有额外的缺点,即正在观看的当前片段可能改变.但是,由于重新排序片段可能存在一些错误 - 请参阅我的问题 - 这种POSITION_NONE方法可能是最安全的方法.