从ViewPager android替换片段

时间:2013-02-15 05:10:06

标签: android android-fragments android-viewpager swipe swipeview

SCENARIO

我正在创建一个带有动态片段创建的片段结构。片段中的每个项目都会创建下一个片段。在场景中,我将所有这些片段存储在片段的ArrayList中,以便我可以轻松替换创建的片段。

问题

现在我通过从特定索引中删除片段并添加新片段来替换ArrayList中的片段。但是当我尝试从该特定索引获取片段时,它会返回旧数据而不再调用FragmentStateAdapter的getItem函数。

这是我的主要课程。

MainActivity.java

public class MainActivity extends FragmentActivity implements
    onPageSelectedListener {
SectionsPagerAdapter mSectionsPagerAdapter;
static int current, listItem;
static String TAG = "MainActivity";
static ViewPager mViewPager;
static ArrayList<Fragment> FragmentList;
static ArrayList<String> titles;

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

public void init(){
    FragmentList = new ArrayList<Fragment>();
    titles = new ArrayList<String>();
    mViewPager = (ViewPager) findViewById(R.id.pager);
    mSectionsPagerAdapter = new SectionsPagerAdapter(
            getSupportFragmentManager());
    mViewPager.setAdapter(mSectionsPagerAdapter);
}

public void addPage(int position, String title, String file, String tag) {
    Fragment fragment = new DummySectionFragment();
    Bundle args = new Bundle();
    args.putString(DummySectionFragment.ARG_FILE_NAME, file);
    args.putString(DummySectionFragment.ARG_FILE_TAG, tag);
    args.putInt(DummySectionFragment.ARG_SECTION_NUMBER, position);
    fragment.setArguments(args);
    titles.add(position, title);
    FragmentList.add(position, fragment);
}

public void NextScreen(int position, String title, String file, String tagname) {
    if(FragmentList.size()>(position-1)){
        for(int i=position; i<FragmentList.size(); i++){
            FragmentList.remove(i);
        }
    }
    addPage(position, title, file, tagname);
    mViewPager.setCurrentItem(position);

}

public static class PageChanger extends
        ViewPager.SimpleOnPageChangeListener {
    private int currentPage;

    @Override
    public void onPageSelected(int position) {
        currentPage = position;
    }

    public int getCurrentScreen() {
        return currentPage;
    }
}
public class SectionsPagerAdapter extends FragmentStatePagerAdapter {

    public SectionsPagerAdapter(FragmentManager fm) {
        super(fm);
        addPage(0, "Main Fragment", "test.xml", "mytag");
    }

    @Override
    public Fragment getItem(int position) {
        return FragmentList.get(position);

    }

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

    @Override
    public CharSequence getPageTitle(int position) {
        if (position == 0) {
            return "Main Categories";
        }
        getItem(position);
        return titles.get(position);
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        super.destroyItem(container, position, object);
    }


}
public static class DummySectionFragment extends Fragment {
    public static final String ARG_SECTION_NUMBER = "section_number";
    public static final String ARG_FILE_NAME = "file_name";
    public static final String ARG_FILE_TAG = "tag_name";

    public DummySectionFragment() {

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        savedInstanceState = this.getArguments();
        ListView parent_list = new ListView(getActivity());
        String file_name = savedInstanceState.getString(ARG_FILE_NAME);
        String tag_name = savedInstanceState.getString(ARG_FILE_TAG);
        int current_level = savedInstanceState.getInt(ARG_SECTION_NUMBER);
        PullParser pull = new PullParser(getActivity());
        pull.pullXml(file_name, tag_name);
        parent_list.setAdapter(new ListAdapter(getActivity(),
                PullParser.Xml_Tag_Info, current_level));
        return parent_list;
    }
}

@Override
public void onPageSelected(int pageno) {
    current = pageno;
}
}

2 个答案:

答案 0 :(得分:1)

我找到答案只是为了在进行必要的更改后重新实例化适配器。编辑后的代码在这里。

MainActivity.java

public class MainActivity extends FragmentActivity {
    SectionsPagerAdapter mSectionsPagerAdapter;
    static int current, listItem;
    static String TAG = "MainActivity";
    static boolean flag = false;

    /**
     * The {@link ViewPager} that will host the section contents.
     */
    static ViewPager mViewPager;
    static ArrayList<DummySectionFragment> FragmentList;
    static ArrayList<String> titles;
    static FragmentManager fragManager;

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

    public void init() {
        FragmentList = new ArrayList<DummySectionFragment>();
        titles = new ArrayList<String>();
        mViewPager = (ViewPager) findViewById(R.id.pager);
        fragManager = getSupportFragmentManager();
        mSectionsPagerAdapter = new SectionsPagerAdapter(fragManager);
        mViewPager.setAdapter(mSectionsPagerAdapter);
        titles.add(0, "Main Categories");
    }

    public void addPage(final int position, String file, String tag) {
        DummySectionFragment fragment = new DummySectionFragment();
        Bundle args = new Bundle();
        args.putString(DummySectionFragment.ARG_FILE_NAME, file);
        args.putString(DummySectionFragment.ARG_FILE_TAG, tag);
        args.putInt(DummySectionFragment.ARG_SECTION_NUMBER, position);
        fragment.setArguments(args);
        try {
            FragmentList.set(position, fragment);
        } catch (IndexOutOfBoundsException e) {
            FragmentList.add(position, fragment);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void destroyFragment(int position) {
        SectionsPagerAdapter pagerAdapter = (SectionsPagerAdapter) mViewPager
                .getAdapter();
        pagerAdapter.destroyItem(mViewPager, position,
                FragmentList.get(position));
        pagerAdapter.notifyDataSetChanged();
    }

    public void addFragment(int position, Object object) {
        SectionsPagerAdapter pagerAdapter = (SectionsPagerAdapter) mViewPager
                .getAdapter();
        pagerAdapter.notifyDataSetChanged();
    }

    public void NextScreen(int position, String title, String file,
            String tagname) {

        if (FragmentList.size() > position - 1) {
            for (int i = FragmentList.size() - 1; i > position; i--) {
                titles.remove(i);
                FragmentList.remove(i);
            }
            titles.trimToSize();
            FragmentList.trimToSize();
        }

        titles.add(position, title);
        addPage(position, file, tagname);
        mViewPager.setAdapter(new SectionsPagerAdapter(fragManager));
        mViewPager.setCurrentItem(position);
    }

    /**
     * A {@link FragmentPagerAdapter} that returns a fragment corresponding to
     * one of the sections/tabs/pages.
     */
    public class SectionsPagerAdapter extends FragmentStatePagerAdapter {

        public SectionsPagerAdapter(FragmentManager fm) {
            super(fm);
            addPage(0, "catlist.xml", "pid-0");
        }

        @Override
        public Fragment getItem(int position) {
            return FragmentList.get(position);

        }

        public void setId() {

        }

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

        @Override
        public int getItemPosition(Object object) {
            return FragmentList.indexOf(object);
        }

        @Override
        public CharSequence getPageTitle(int position) {
            Log.v("titlePosition", position + "");
            return titles.get(position);
        }
    }

    /**
     * A dummy fragment representing a section of the app, but that simply
     * displays dummy text.
     */
    public static class DummySectionFragment extends Fragment {
        /**
         * The fragment argument representing the section number for this
         * fragment.
         */
        public static ArrayList<Xml_Item_Data> resultList = new ArrayList<Xml_Item_Data>();
        public static final String ARG_SECTION_NUMBER = "section_number";
        public static final String ARG_FILE_NAME = "file_name";
        public static final String ARG_FILE_TAG = "tag_name";
        ListView parent_list;
        public static Bundle setValues;

        public DummySectionFragment() {

        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            savedInstanceState = this.getArguments();
            parent_list = new ListView(getActivity());
            String file_name = savedInstanceState.getString(ARG_FILE_NAME);
            String tag_name = savedInstanceState.getString(ARG_FILE_TAG);
            int current_level = savedInstanceState.getInt(ARG_SECTION_NUMBER);
            PullParser pull = new PullParser(getActivity());
            pull.pullXml(file_name, tag_name);
            ListAdapter list_Creator = new ListAdapter(getActivity(),
                    PullParser.Xml_Tag_Info, current_level);
            parent_list.setAdapter(list_Creator);
            return parent_list;
        }
    }
}

答案 1 :(得分:0)

我认为您可以尝试在getItemPosition()方法中返回POSITION_NONE。就像这里:How to force ViewPager to re-instantiate its items