【问题标题】:How to deal with FragmentPagerAdapter reusing Fragments?如何处理 FragmentPagerAdapter 重用 Fragments?
【发布时间】:2014-03-30 06:35:19
【问题描述】:

所以,我正在尝试使用 Android 支持 v4 库中的 ViewPager,但它(或 FragmentPagerAdapter)如何处理片段存在一些严重问题。例如,我将 FragmentPagerAdapter 子类化以执行以下操作:

public class MyPagerAdapter extends FragmentPagerAdapter
{
private ArrayList<Fragment> fragments = null;
private ArrayList<Data> data = null;

public MyPagerAdapter(FragmentManager fragmentManager, ArrayList<Data> data)
{
    super(fragmentManager);

    this.data = data;

    fragments = new ArrayList<Fragment>();

    for(Data datum : data)
    {
        MyDataFragment fragment = new MyDataFragment();
        fragment.setData(datum);
        fragments.add(fragment);
    }
}

@Override
public Fragment getItem(int i)
{
    return fragments.get(i);
}

@Override
public int getCount()
{
    return fragments.size();
}
}

现在,我认为这已经足够了,我可以继续使用 Fragments 通常实现的 onCreateView 方法来实现 MyDataFragment。但是我遇到了一个有趣的问题。当我离开 Activity,然后回到它时,ViewPager 会显示为空白。不知何故,它通过调用 findFragmentByTag 来重用 Fragment,然后根本不调用 getItem 等。更糟糕的是,Fragment 不会收到 onCreateView 事件。所以我想我可以通过将我的onCreateView 代码移动到onAttach 来利用ViewPager 的片段缓存,该代码主要获取对片段膨胀的各种视图的引用。唯一的问题是,在onAttach 期间,MyDataFragment 的getView 方法总是返回null。在线片段的所有示例都描述了onCreateView 应该具有您的所有视图设置代码。好的。但是,当我创建像MyDataFragment.setSomeField(String value) 这样的方法时,我需要使用对TextView 的引用。由于 onCreateView 并不总是被调用(例如,当 FragmentPagerAdapter 神奇地回收 Fragments 时),最好在 onAttach 中获取该引用。但是,在onAttach 期间,Fragment 的根视图仍然为空(可能是因为一开始没有调用onCreateView)!之后没有其他事件发生(onActivityCreated 除外,它与 Fragment 本身无关),所以没有地方可以做设置代码。这应该如何工作?是我遗漏了什么重要的东西,还是这个 Fragment 系统是猴子设计的?

【问题讨论】:

    标签: android-fragments android-viewpager fragmentpageradapter


    【解决方案1】:

    我不确定这是否是 FragmentPagerAdapter 的正确用例(听起来更像是您想用 ListAdapter 做的事情)。

    来自FragmentPagerAdapter 文档:

    PagerAdapter 的实现,将每个页面表示为一个 Fragment 只要用户一直保存在片段管理器中 可以返回页面。

    这个版本的寻呼机最适合在有少数人的情况下使用 通常是更多的静态片段要被分页,例如一组 标签。用户访问的每个页面的片段将保存在 内存,尽管它的视图层次结构在不可见时可能会被破坏。 这可能会导致使用大量内存,因为片段 实例可以保持任意数量的状态。对于较大的套装 页面,请考虑 FragmentStatePagerAdapter。

    我会考虑切换到 FragmentStatePagerAdapter 或 ListAdapter。 如果您希望调用 createView,则每次都必须重新创建它(销毁旧片段并创建新片段),但我再次认为这不是您想要的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-13
      • 1970-01-01
      • 1970-01-01
      • 2011-08-30
      相关资源
      最近更新 更多