4

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

4

1 回答 1

1

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

FragmentPagerAdapter文档:

PagerAdapter 的实现,它将每个页面表示为一个 Fragment,只要用户可以返回该页面,它就会永久保存在 Fragment 管理器中。

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

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

于 2014-03-29T22:35:19.613 回答