动态地将页面添加到Fragment Page Adapter

时间:2014-01-20 12:51:07

标签: android android-fragments

我是Android新手,使用了FragmentPageAdapter,它在使用时效果非常好,如下所示

 public Fragment getItem(int position) {

        if (position == 0) {
                MenuItemFragment frag = new MenuItemFragment();
                Bundle bundle = new Bundle();
                bundle.putInt("pos", position);
                frag.setArguments(bundle);
                return frag;
            } else if (position == 1) {
                MenuItemFragment1 frag = new MenuItemFragment1();
                Bundle bundle = new Bundle();
                bundle.putInt("pos", position);
                frag.setArguments(bundle);
                return frag;
            } else if (position == 2) {
                MenuItemFragment2 frag = new MenuItemFragment2();
                Bundle bundle = new Bundle();
                bundle.putInt("pos", position);
                frag.setArguments(bundle);
                return frag;
            }
            return null;
        }    

所以在上面的代码中我需要为相应的位置充气MenuItemFragment。

我的问题是:是否可以根据某些条件动态添加片段。在这里,我的所有片段都具有相同的布局,但每个片段的数据都会发生变化。

我为上面的代码动态返回片段做了什么。如下。

public Fragment getItem(int position) {
    if (SubMenuActivity.sMenuCategory.size() > 0) {
        SubMenuActivity.sMenuCategory.clear();
    }

    MenuItemFragment frag = new MenuItemFragment();
    try {
        for (int j = 0; j < SubMenuActivity.sMenuCard.size(); j++) {
            String category = SubMenuActivity.sMenuCard.get(j).mCategory;
            String header = SubMenuActivity.sMenuFragHeader[position];

            if (category.equalsIgnoreCase(header)) {
                SubMenuActivity.sMenuCategory.add(SubMenuActivity.sMenuCard
                        .get(j));
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

    return frag;

}

这里的问题是,对于每个位置我都在向sMenuCategory添加数据。但是这里getItem(位置)第一次循环两次并清除位置为零时添加的数据,并保留位置为1时添加的数据并显示前两个片段的相同数据。

请帮我解决这个问题。清除每个位置的arrayList,以便按照不重复的列表包含数据。

1 个答案:

答案 0 :(得分:1)

在你的寻呼机适配器内部保留和片段数组并动态更新它:

private ArrayList<Fragment> fragments = new ArrayList<Fragment>();

        public <constructor>() {
            MenuItemFragment frag = new MenuItemFragment();
            Bundle bundle = new Bundle();
            bundle.putInt("pos", 0);
            frag.setArguments(bundle);
            fragments.add(frag);
            MenuItemFragment1 frag1 = new MenuItemFragment1();
            Bundle bundle1 = new Bundle();
            bundle.putInt("pos", 1);
            frag1.setArguments(bundle1);
            fragments.add(frag1);
            MenuItemFragment2 frag2 = new MenuItemFragment2();
            Bundle bundle2 = new Bundle();
            bundle.putInt("pos", 2);
            frag2.setArguments(bundle2);
            fragments.add(frag2);
        }

        @Override
        public Fragment getItem(int position) {
            // TODO Auto-generated method stub
            return fragments.get(position);
        }

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

        public void addFragment(Fragment fragment) {
            fragments.add(fragment);
        }

添加新片段只需调用:

adapter.add(<fragment>);
adapter.notifyDataSetChanged();