Моя проблема в том, что у меня есть ViewPager, который отображает 4 фрагмента (скажем: A, B, C, D). Но иногда, когда пользователь нажимает на что-то, мне нужно заменить, например, A другим фрагментом (скажем, E). Я сделал это, переопределив getItemPosition и создав собственный метод setCurrentItem в моем ViewPager. Вот мои классы:Android ViewPager заменит текущий фрагмент, но при отклонении первоначального значения не перезагружается
MyFragmentStatePagerAdapter:
public class MyFragmentStatePagerAdapter extends FragmentStatePagerAdapter {
private Map<Integer, Fragment> overrides;
public void setOverride(int position, Fragment fragment) {
overrides.put(position, fragment);
}
...
@Override
public final Fragment getItem(final int position) {
Fragment fragment = overrides.remove(position);
if (fragment != null) {
return fragment;
} else {
... // return corresponding base Fragment (A, B, C, D)
}
}
@Override
// this is overrideden to ensure
public final int getItemPosition(final Object object) {
return PagerAdapter.POSITION_NONE;
}
}
И мой MyViewPager:
public class MyViewPager extends ViewPager {
...
public MyAdapter adapter() {
return (MyAdapter) this.getAdapter();
}
public void setCurrentItem(final int item, final Fragment fragment) {
if (this.getAdapter() == null) {
return;
}
this.adapter().setOverride(item, fragment);
if (item == this.getCurrentItem()) {
this.getAdapter().notifyDataSetChanged();
} else {
this.setCurrentItem(item);
}
}
}
Так что это работает безупречно, но когда я красть назад от фрагмента и красть назад я хочу снова увидеть отображение, но я все еще вижу E.
Кто-нибудь получил решение этой проблемы?
Спасибо.
Стик точку останова на GetItem и посмотреть, если он попадает снова. Если вы отбросьте первый фрагмент и вернетесь к нему, вы увидите, что getItem вызывается для третьего элемента, где он предварительно загружает содержимое вне экрана. См. Здесь для получения более подробной информации - http://developer.android.com/reference/android/support/v4/view/ViewPager.html#setOffscreenPageLimit%28int%29 –
Попробуйте вызвать 'notifyDataSetChanged()' каждый раз на вашем 'setCurrentItem' , –
Переопределение setCurrentItem и вызов notifyDataSetChanged перед запуском super.setCurrentItem, но это действительно замедляет работу. Возможно, существует способ аннулировать только фрагмент, который получил переопределение. – ffddani