android - 从 FragmentStatePagerAdapter 中删除 fragment

标签 android android-fragments

更新

在与这个问题进行了一番激烈的斗争并得到了 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/

相关文章:

android - MaterialSearchView android中的OnClick项目选择

当 keystore 或属性不存在时,Android 签名应用回退

android - 如何控制 Android ImageSwitcher 中的过渡持续时间

c# - 有没有办法以编程方式在 android 中创建布局的副本?

java - Mapbox 无法在 fragment 中工作

java - 不使用接口(interface)将数据从 Activity 传递到非 fragment/Activity 类

android - 如何在android中的ExpandableListView的getChildView中识别按钮点击

安卓 : Which method is called when fragment is pop out from backstack

android - 如何在静态方法中访问 getSupportFragmentManager()?

android - 在 android 中隐藏 Tablayout 栏