更新
经过一番激烈的争斗和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
。而我确信,在通知适配器后,适配器不再持有任何这些Fragments
。如果您想这样做,请将您的
mSaveState
更改为protected
,这样您就可以从扩展类(在我的情况下是VerticalAdapter
)中获取它。我忘了提到,我正在使用Adam Speakman的FragmentStatePagerAdapter修复程序来解决我的问题。
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
我遇到的问题是需要完全删除一些在
FragmentStatePagerAdapter
中保存的Fragments
。我已经对其进行了
POSITION_NONE
修复,但旧的fragments似乎仍然存在。构造方面,由于我的
ViewPager
的构造方式不同寻常,所以我被迫在继承FragmentStatePagerAdapter
的VerticalAdater
内部放置一个包含所有片段的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();
}
问题
我已经创建了一个特殊的方法来清除我的 FragmentStatePagerAdapter
中某一点之前的所有 Fragments
, 它工作得很好,但是问题是我无法清除 FragmentStatePagerAdapter
内部的 ArrayList
。即使我清除了 SparseArray
,VerticalAdapter
继承的 FragmentStatePagerAdapter
的 ArrayList
仍然持有我不想要的 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;
}
getFragmentForPosition(position);
。 - mmloolooAdapter
中唯一缺少的方法是setProgress
,它填充了fragments
数组。 为什么我知道它是旧状态?因为setProgress
正在使用我的Fragments
的newinstance
重新加载整个fragments
数组。 此外,ViewPager
数组中的Fragments
的ID与setProgress
之前相同。 - JakubW