如何处理FragmentPagerAdapter重用Fragments?

时间:2013-08-13 19:31:57

标签: android-fragments android-viewpager fragmentpageradapter

所以,我正在尝试使用Android支持v4库中的ViewPager,但是它(或FragmentPagerAdapter)如何处理Fragments存在一些严重问题。例如,我将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。但我遇到了一个有趣的问题。当我离开活动,然后回到它时,ViewPager将显示为空白。不知何故,它通过调用findFragmentByTag来重用Fragments,然后甚至根本不调用getItem等等。更糟糕的是,Fragment将不会发生onCreateView事件。所以我想我可以利用ViewPager的Fragment缓存,将onCreateView代码(主要是抓取片段膨胀的各种视图的引用)移动到onAttach。唯一的问题是,在onAttach期间,MyDataFragment的getView方法始终返回null。在线片段的所有示例都描述了onCreateView应该包含所有视图设置代码。好的。但是,当我创建像MyDataFragment.setSomeField(String value)这样的方法时,我需要使用对TextView的引用。由于onCreateView并不总是被调用(例如,当片段被FragmentPagerAdapter神奇地回收时),最好在onAttach中获取该引用。但是,在onAttach期间,片段的根视图仍为空(可能是因为onCreateView未首先调用)!此后不会发生其他事件(onActivityCreated除外,它与Fragment本身无关),因此无法进行设置代码。这应该怎么样?我错过了一些重要的东西,还是由猴子设计的片段系统?

1 个答案:

答案 0 :(得分:1)

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

来自FragmentPagerAdapter文档:

  

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

     

此版本的寻呼机最适合在少数人使用时使用   通常会通过更多静态片段进行分页,例如一组   标签。用户访问的每个页面的片段将保留在其中   内存,虽然它的视图层次结构可能在不可见时被销毁。   这可能导致自片段以来使用大量内存   实例可以保持任意数量的状态。对于较大的集合   的页面,请考虑FragmentStatePagerAdapter。

我考虑切换到FragmentStatePagerAdapter或者ListAdapter。 如果你想要调用createView,每次都必须重新创建它(破坏旧片段并创建新片段),但我再也不认为这是你想要的。