gpt4 book ai didi

android - 从 FragmentStatePagerAdapter 中删除 fragment

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:27:35 25 4
gpt4 key购买 nike

更新

在与这个问题进行了一番激烈的斗争并得到了 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 扩展的 FragmentStatePagerAdapterArrayList 仍然持有 我不想在那里的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com