FragmentStatePagerAdapter

FragmentStatePagerAdapter

更新

在解决了这个问题并获得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 by Adam Speakman解决我的问题。

////////////////////////////////////////////////////////问题部分////////////////////////////////////////////////////////

我遇到的问题是我需要完全删除Fragments中保存的FragmentStatePagerAdapter的一部分。

我已经完成了POSITION_NONE修复,但是旧 fragment 似乎仍然完好无损。

建筑

因为ViewPager的构造不寻常,所以我被迫将VerticalAdater扩展到FragmentStatePagerAdapter内,该SparseArray容纳了我所有的 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();
}

问题

我做了一个特殊的方法,负责清除Fragments中的所有FragmentStatePagerAdapter。它工作正常,但我无法摆脱的问题是清除ArrayList中的FragmentStatePagerAdapter。即使我清除了SparseArray,我的ArrayList扩展的FragmentStatePagerAdapterVerticalAdapter仍然保存着我不想在那里保存的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;
}

最佳答案

FragmentStatePageAdapter在破坏 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/

10-10 02:13