UPDATE
После некоторых серьезных боевых действий с этой проблемой и помощи со стороны пользователей SO мне удалось ее решить.
Вот как выглядит мой clearProgressUpTo
.
public void clearProgressUpTo(int progress) {
boolean deleted = false;
for (int i = fragments.size() - 1; i > 0; i--) {
int key = fragments.keyAt(i);
if (key != progress) {
fragments.delete(key);
deleted = true;
} else {
break;
}
}
if (deleted)
notifyDataSetChanged(); //prevents recursive call (and IllegalStateException: Recursive entry to executePendingTransactions)
while (mSavedState.size() > progress) {
mSavedState.remove(mSavedState.size()-1);
}
}
Причина, по которой я делаю это после notifyDataSetChanged
, состоит в том, что initiateItem
снова заполняет мой mSavedState
. И я уверен, что после уведомления моего adapter
не выполняется ни одно из этих Fragments
.
Также, если вы хотите сделать это так, измените ваш mSaveState
на protected
, чтобы вы могли получить его из расширяющегося класса (в моем случае VerticalAdapter
).
Я забыл упомянуть, что я использую FragmentStatePagerAdapter fix от Adam Speakman, чтобы решить мою проблему.
///////////////////////////////////////////////////// ЧАСТЬ ВОПРОСА//////////////////////////////////////////////////////
проблема, с которой я столкнулась, заключается в том, что мне нужно полностью удалить часть Fragments
, содержащуюся в FragmentStatePagerAdapter
.
Я уже сделал исправление POSITION_NONE
, но старые фрагменты по-прежнему остаются неповрежденными.
КОНСТРУКЦИЯ
Поскольку конструкция моего ViewPager
необычна, мне пришлось помещать внутри моего VerticalAdater
расширение FragmentStatePagerAdapter
a SparseArray
, которое содержит все мои фрагменты.
public class VerticalAdapter extends FragmentStatePagerAdapter {
private SparseArray<Fragment> fragments = new SparseArray<Fragment>();
...
@Override
public Fragment getItem(int position) {
return getFragmentForPosition(position);
}
@Override
public int getCount() {
return fragments.size();
}
ПРОБЛЕМА
Я сделал специальный метод, отвечающий за очистку всего Fragments
до некоторой точки в моем FragmentStatePagerAdapter
. Его работа хорошо, но проблема, с которой я не могу избавиться, очищает ArrayList
внутри FragmentStatePagerAdapter
. Даже если я очистил SparseArray
, ArrayList
от FragmentStatePagerAdapter
, что my VerticalAdapter
extends все еще держит Fragments
, который я не хочу иметь там. Из-за этого, когда я создаю новый Fragments
, у них есть состояние старых.
public void clearProgressUpTo(int progress) {
boolean deleted = false;
for (int i = fragments.size() - 1; i > 0; i--) {
int key = fragments.keyAt(i);
if (key != progress) {
fragments.delete(key);
deleted = true;
} else {
break;
}
}
if (deleted)
notifyDataSetChanged(); //prevents recursive call (and IllegalStateException: Recursive entry to executePendingTransactions)
}
Если вам нужна дополнительная информация/код, пожалуйста, скажите мне в комментариях, я постараюсь предоставить как можно больше информации.
Я понятия не имею, как исправить эту проблему, поэтому любой ввод будет оценен.
ИЗМЕНИТЬ
Добавление запрошенного кода.
private Fragment getFragmentForPosition(int position) {
return fragments.get(getKeyForPosition(position));
}
public int getKeyForPosition(int position) {
int key = 0;
for (int i = 0; i < fragments.size(); i++) {
key = fragments.keyAt(i);
if (i == position) {
return key;
}
}
return key;
}