2

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();
}

FragmentPagerAdapter は ViewPager のアダプターとして設定され、その後、フラグメントを並べ替えます (シャッフルはテスト用でした)。

Collections.shuffle(mSectionsPagerAdapter.getFragments());
mSectionsPagerAdapter.notifyDataSetChanged();

何らかの理由で、順序が異なるため getItem に対して異なるフラグメントを返す場合でも、タイトルの順序のみが変更されています。これはなぜですか、どうすれば回避できますか?

4

2 に答える 2

9

また、をオーバーライドする必要がありますgetItemPosition()。デフォルトでは、この関数は常にを返すPOSITION_UNCHANGEDため、を呼び出すnotifyDataSetChanged()と、アダプターはすべてのフラグメントがまだ同じ位置にあると想定します。getItem()(必要なフラグメントはすべてすでに作成されていると見なされるため、再度呼び出すことはありません。)getItemPosition()シャッフル後、newは各フラグメントの新しい位置を返す必要があります。

簡単なハックは常にを返すことです。そうすればPOSITION_NONE、アダプタは既存のフラグメントをすべて破棄し、を呼び出すときにそれらを正しい位置に再作成しますgetItem()。もちろん、これは効率的ではなく、表示されている現在のフラグメントが変更される可能性があるという追加の欠点があります。ただし、フラグメントの並べ替えにはバグがある可能性があるため(ここで私の質問を参照)、このPOSITION_NONEアプローチが最も安全な方法である可能性があります。

于 2012-09-24T01:29:56.087 に答える