réorganiser des pages dans FragmentStatePagerAdapter à l'aide de getItemPosition(Object objet)

Je crois que FragmentStatePagerAdapter ne se comporte pas correctement lors de la substitution getItemPosition(Object object) avec le but de réorganiser les pages.

Ci-dessous est un exemple simple. Dans l'état initial, l'ordre des pages est {A, B, C}. Sur appel de toggleState(), l'ordre des pages changements à {A, C, B}. En substituant getItemPosition(Object object), nous nous assurons que la page en cours en cours de visualisation (A, B, ou C) ne change pas.

public static class TestPagerAdapter extends FragmentStatePagerAdapter {
private boolean mState = true;
public TestPagerAdapter(FragmentManager fragmentManager) {
super(fragmentManager);
}
@Override
public int getCount() {
return 3;
}
private void toggleState() {
mState = !mState;
notifyDataSetChanged();
}
private String getLabel(int position) {
switch (position) {
case 0:
return "A";
case 1:
return mState ? "B" : "C";
default:
return mState ? "C" : "B";
}
}
@Override
public int getItemPosition(Object object) {
String label = ((TestFragment) object).getLabel();
if (label.equals("A")) {
return 0;
} else if (label.equals("B")) {
return mState ? 1 : 2;
} else {
return mState ? 2 : 1;
}
}
@Override
public CharSequence getPageTitle(int position) {
return getLabel(position);
}
@Override
public Fragment getItem(int position) {
return TestFragment.newInstance(getLabel(position));
}
}

J'ai rencontré deux comportements qui semblent incorrectes.

  1. Si j'ai immédiatement appel toggleState() (lors de l'affichage de la page Une, avant de glisser vers toute autre page), l'application se bloque.

    java.lang.IndexOutOfBoundsException: Invalid index 2, size is 2
    at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)
    at java.util.ArrayList.set(ArrayList.java:477)
    at android.support.v4.app.FragmentStatePagerAdapter.destroyItem(FragmentStatePagerAdapter.java:136)
    at android.support.v4.view.ViewPager.populate(ViewPager.java:867)
    at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:469)
    at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:441)
    at android.support.v4.view.ViewPager.dataSetChanged(ViewPager.java:766)
    at android.support.v4.view.ViewPager$PagerObserver.onChanged(ViewPager.java:2519)
    at android.database.DataSetObservable.notifyChanged(DataSetObservable.java:37)
    at android.support.v4.view.PagerAdapter.notifyDataSetChanged(PagerAdapter.java:276)
    at com.ugglynoodle.test.testfragmentstatepageradapter.MainActivity$TestPagerAdapter.toggleState(MainActivity.java:55)
    ...

    Regardant le source de FragmentStatePagerAdapter, ce serait fixé par vérifier d'abord la taille de mFragments (comme dans les lignes 113-115) avant d'appeler set() en ligne 136.

  2. Si j'ai d'abord balayez vers la page B, puis getItem(2) est appelé, à la page C est créé, et mFragments a maintenant une taille de 3 (cela permettra d'éviter le crash au-dessus de passe dans un instant). Ensuite, j'ai balayez vers le retour à Une page, et la page C est détruit, comme il devrait l'être (car il est de 2 pages, et je suis en utilisant la valeur par défaut à l'écran à la limite de page 1). Maintenant, j'appelle toggleState(). La Page B est aujourd'hui détruit. Néanmoins, la page C est PAS recréé! Cela signifie que, lorsque j'ai maintenant faire glisser vers la droite, j'obtiens une page vide.

Tout d'abord, il serait bon de savoir si je suis correct et ce sont en fait des bugs, ou si je fais quelque chose de mal. Si ils sont des bugs, n'importe qui peut proposer une solution (autre que le débogage et la reconstruction de la bibliothèque de prise en charge moi-même)? Sûrement quelqu'un doit avoir remplacé getItemPosition(Object object) avec succès (à l'exception de la mise à POSITION_NONE)?

Je suis à l'aide de la révision en cours (10) de la bibliothèque de prise en charge.

InformationsquelleAutor UgglyNoodle | 2012-09-20