FragmentPagerAdapter在第一页上显示所有片段内容

时间:2013-04-03 18:53:49

标签: java android android-fragments android-viewpager fragmentpageradapter

在内存中,我有一个Items列表,每个都有一个标题和一个0..N Chunks列表(存储一些信息)。我知道我正在内存中正确创建此列表,因为我已将整个结构输出到命令行。

我有一个使用ViewPager显示此数据的活动。 ViewPager的每个页面都是一个Item,它填充了Fragment,用于保存项目每个Chunk的信息。

我目前编码的方式,前两个项目的块显示在第一个项目下的第一页上。当页面滚动到第二页时,它是空的。当页面滚动到第3页(我现在只有3个项目列表供测试)时,它也会显示一个空白页面,但是当页面返回到第2页面时,它会显示第1个项目的块。然后,每次导航到第一页然后第二页时,第三页的块被新添加到现有列表中。如果存在从第2页到第3页以及后退的导航,则第1项中的块将新添加到列表中。这可以通过不断增长的列表令人作呕来完成。我不知道为什么表现不正常。

这是我的主要活动(包括FragmentPagerAdapter):

public class MyActivity extends FragmentActivity {
    MyPagerAdapter mPagerAdapter;
    ViewPager mViewPager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Controller.setup();

        mPagerAdapter = new MyPagerAdapter(getSupportFragmentManager());

        mViewPager = (ViewPager) findViewById(R.id.pager);
        mViewPager.setAdapter(mPagerAdapter);
    }

    public class MyPagerAdapter extends FragmentPagerAdapter {
        public MyPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            Fragment fragment = new MyFragment();

            Bundle args = new Bundle();
            args.putInt(MyFragment.POSITION, position);
            fragment.setArguments(args);

            return fragment;
        }

        @Override
        public int getCount(){
            return Controller.getAmount();
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return Controller.getItem(position).getTitle();
        }
    }
}

Controller非常简单,可以像您期望的那样返回信息。 Controller.setup()只创建Items列表。

这是我的物品片段:

public class MyFragment extends Fragment {
    public final static String POSITION = "position";
    private int pos;

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        pos = getArguments().getInt(POSITION);
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_item, container, false);

        Item item = Controller.getItem(pos);
        Iterator<Chunk> chunks = item.getChunks().iterator();
        FragmentManager manager = getFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();

        while(chunks.hasNext()){
            Chunk chunk = chunks.next();
            ChunkFragment entry = new ChunkFragment();

            Bundle args = new Bundle();         
            args.putString(ChunkFragment.INFO_ARG, chunk.getInfo());
            entry.setArguments(args);

            transaction.add(R.id.container, entry);
        }
        transaction.commit();

        return rootView;
    }
}

最后我的Chunk片段:

public class ChunkFragment extends Fragment {
    public static final String INFO_ARG = "Info";
    private String mInfo;

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        Bundle args = getArguments();
        mInfo = args.getString(INFO_ARG);
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        //setup view
        ViewGroup rootView;

        rootView = (ViewGroup) inflater.inflate(R.layout.fragment_chunk, container, false);

        TextView infoView = (TextView) rootView.findViewById(R.id.info_text);
        infoView.setText(mInfo);

        return rootView;
    }
}

我知道这是很多代码,但我不知道问题出在哪里。我把它简化到最低限度,只包括可能成为问题根源的操作。我还没有包含我的XML布局文件,但它们已经过测试并且工作正常。

1 个答案:

答案 0 :(得分:3)

我不确定这一点,但我相信您的问题可能与在ViewPager中片段中实例化片段的困难有关。

您可以考虑取消将此作为可能性之一by following the guidelines for nesting fragments:这实际上归结为在您要添加片段的片段中使用getChildFragmentManager()

此外,您可能需要考虑扩展FragmentStatePagerAdapter,以便在破坏和重新创建之间更好地维护片段状态。