所以,我正在尝试使用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本身无关),因此无法进行设置代码。这应该怎么样?我错过了一些重要的东西,还是由猴子设计的片段系统?
答案 0 :(得分:1)
我不确定这是FragmentPagerAdapter的正确用例(听起来更像是你想要用ListAdapter做的事情)。
来自FragmentPagerAdapter文档:
PagerAdapter的实现,将每个页面表示为片段 只要用户,它就一直保存在片段管理器中 可以返回页面。
此版本的寻呼机最适合在少数人使用时使用 通常会通过更多静态片段进行分页,例如一组 标签。用户访问的每个页面的片段将保留在其中 内存,虽然它的视图层次结构可能在不可见时被销毁。 这可能导致自片段以来使用大量内存 实例可以保持任意数量的状态。对于较大的集合 的页面,请考虑FragmentStatePagerAdapter。
我考虑切换到FragmentStatePagerAdapter或者ListAdapter。 如果你想要调用createView,每次都必须重新创建它(破坏旧片段并创建新片段),但我再也不认为这是你想要的。