更新
在与这个问题进行了一番激烈的斗争并得到了 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
这样你就可以从扩展类中获取它(在我的例子中是 垂直适配器
).
我忘了说我正在使用 FragmentStatePagerAdapter fix by Adam Speakman解决我的问题。
//////////////////////////////////////////////////问题部分///////////////////////////////////////////////////
我遇到的问题是我需要完全删除 FragmentStatePagerAdapter
中的一些 Fragments
。
我已经完成了 POSITION_NONE
修复,但旧 fragment 似乎仍然完好无损。
建筑
因为我的 ViewPager
的构造不寻常,我被迫在我的 VerticalAdater
中放置一个 SparseArray
扩展 FragmentStatePagerAdapter
> 里面装着我所有的 fragment 。
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
仍然持有 我不想在那里的 fragment
。因此,当我创建新的 Fragments
时,它们具有旧 fragment 的状态。
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;
}
最佳答案
FragmentStatePageAdapter
在销毁 fragment 时保存 fragment 的状态,以便稍后在 fragment 重新创建时保存的状态将应用于它。
fragment 状态存储在私有(private)成员变量中。因此,我们无法扩展当前的实现来添加删除已保存状态的功能。
我克隆了当前的 FragmentStatePagerAdapter
实现并包含了保存状态删除功能。这是 gist reference .
/**
* Clear the saved state for the given fragment position.
*/
public void removeSavedState(int position) {
if(position < mSavedState.size()) {
mSavedState.set(position, null);
}
}
在您的 clearProgressUpTo
方法中,每当您从稀疏数组中删除 fragment 时,调用此方法,它会清除该 fragment 的保存状态。
关于android - 从 FragmentStatePagerAdapter 中删除 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25928732/