从ViewPager机器人更换片段 [英] Replacing a fragment from ViewPager android

查看:162
本文介绍了从ViewPager机器人更换片段的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

情景

我创建动态片段的作品片段的结构。在该片段的每个项目创建下一片段。在该方案中,我存储片段的ArrayList中的所有这些片段,这样我可以轻松地更换创建片段。

问题

现在我更换从ArrayList的片段通过删除特定索引碎片并添加新的。但是,当我试图从特定索引得到片段它返回我的旧数据,而无需再次调用FragmentStateAdapter的功能的getItem

下面是我的主类。

MainActivity.java

 公共类MainActivity扩展FragmentActivity工具
    onPageSelectedListener {
SectionsPagerAdapter mSectionsPagerAdapter;
静态INT当前,的listItem;
静态字符串标记=MainActivity;
静态ViewPager mViewPager;
静态的ArrayList<片断> FragmentList;
静态的ArrayList<串GT;标题;@覆盖
保护无效的onCreate(捆绑savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.activity_main);
    在里面();
}公共无效的init(){
    FragmentList =新的ArrayList<片断>();
    标题=新的ArrayList<串GT;();
    mViewPager =(ViewPager)findViewById(R.id.pager);
    mSectionsPagerAdapter =新SectionsPagerAdapter(
            getSupportFragmentManager());
    mViewPager.setAdapter(mSectionsPagerAdapter);
}公共无效addPage(INT位置,标题字符串,字符串文件,字符串变量){
    片段片段=新DummySectionFragment();
    捆绑ARGS =新包();
    args.putString(DummySectionFragment.ARG_FILE_NAME,文件);
    args.putString(DummySectionFragment.ARG_FILE_TAG,标签);
    args.putInt(DummySectionFragment.ARG_SECTION_NUMBER,位置);
    fragment.setArguments(参数);
    titles.add(职务,职称);
    FragmentList.add(位置,片段);
}公共无效NextScreen(INT位置,标题字符串,字符串文件,字符串标记名){
    如果(FragmentList.size()>(位置1)){
        的for(int i =位置; I< FragmentList.size();我++){
            FragmentList.remove(ⅰ);
        }
    }
    addPage(职务,职称,档案,标记名);
    mViewPager.setCurrentItem(位置);}公共静态类PageChanger扩展
        ViewPager.SimpleOnPageChangeListener {
    私人诠释当前页;    @覆盖
    公共无效使用onPageSelected(INT位置){
        当前是=位置;
    }    公众诠释getCurrentScreen(){
        返回当前页;
    }
}
公共类SectionsPagerAdapter扩展FragmentStatePagerAdapter {    公共SectionsPagerAdapter(FragmentManager FM){
        超(FM);
        addPage(0,主片段,的test.xml,MyTag的);
    }    @覆盖
    公共片段的getItem(INT位置){
        返回FragmentList.get(位置);    }    @覆盖
    公众诠释的getCount(){
        返回FragmentList.size();
    }    @覆盖
    公共CharSequence的getPageTitle(INT位置){
        如果(位置== 0){
            返回主类别;
        }
        的getItem(位置);
        返回titles.get(位置);
    }    @覆盖
    公共无效destroyItem(ViewGroup中的容器,INT位置,Object对象){
        super.destroyItem(集装箱,位置,对象);
    }
}
公共静态类DummySectionFragment扩展片段{
    公共静态最后弦乐ARG_SECTION_NUMBER =SECTION_NUMBER;
    公共静态最后弦乐ARG_FILE_NAME =FILE_NAME
    公共静态最后弦乐ARG_FILE_TAG =TAG_NAME;    公共DummySectionFragment(){    }    @覆盖
    公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,
            捆绑savedInstanceState){
        savedInstanceState = this.getArguments();
        ListView控件parent_list =新的ListView(getActivity());
        字符串FILE_NAME = savedInstanceState.getString(ARG_FILE_NAME);
        字符串TAG_NAME = savedInstanceState.getString(ARG_FILE_TAG);
        INT CURRENT_LEVEL = savedInstanceState.getInt(ARG_SECTION_NUMBER);
        PullParser拉=新PullParser(getActivity());
        pull.pullXml(FILE_NAME,TAG_NAME);
        parent_list.setAdapter(新ListAdapter(getActivity(),
                PullParser.Xml_Tag_Info,CURRENT_LEVEL));
        返回parent_list;
    }
}@覆盖
公共无效使用onPageSelected(INT帮您做生意){
    电流=帮您做生意;
}
}


解决方案

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

MainActivity.java

 公共类MainActivity扩展FragmentActivity {
    SectionsPagerAdapter mSectionsPagerAdapter;
    静态INT当前,的listItem;
    静态字符串标记=MainActivity;
    静态布尔标志= FALSE;    / **
     *本{@link ViewPager}将承载部分内容。
     * /
    静态ViewPager mViewPager;
    静态的ArrayList< D​​ummySectionFragment> FragmentList;
    静态的ArrayList<串GT;标题;
    静态FragmentManager fragManager;    @覆盖
    保护无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.activity_main);
        在里面();
    }    公共无效的init(){
        FragmentList =新的ArrayList< D​​ummySectionFragment>();
        标题=新的ArrayList<串GT;();
        mViewPager =(ViewPager)findViewById(R.id.pager);
        fragManager = getSupportFragmentManager();
        mSectionsPagerAdapter =新SectionsPagerAdapter(fragManager);
        mViewPager.setAdapter(mSectionsPagerAdapter);
        titles.add(0,主要分类);
    }    公共无效addPage(最终诠释位置,字符串文件,字符串变量){
        DummySectionFragment片段=新DummySectionFragment();
        捆绑ARGS =新包();
        args.putString(DummySectionFragment.ARG_FILE_NAME,文件);
        args.putString(DummySectionFragment.ARG_FILE_TAG,标签);
        args.putInt(DummySectionFragment.ARG_SECTION_NUMBER,位置);
        fragment.setArguments(参数);
        尝试{
            FragmentList.set(位置,片段);
        }赶上(抛出IndexOutOfBoundsException E){
            FragmentList.add(位置,片段);
        }赶上(例外五){
            e.printStackTrace();
        }
    }    公共无效destroyFragment(INT位置){
        SectionsPagerAdapter pagerAdapter =(SectionsPagerAdapter)mViewPager
                .getAdapter();
        pagerAdapter.destroyItem(mViewPager,位置,
                FragmentList.get(位置));
        pagerAdapter.notifyDataSetChanged();
    }    公共无效addFragment(INT位置,Object对象){
        SectionsPagerAdapter pagerAdapter =(SectionsPagerAdapter)mViewPager
                .getAdapter();
        pagerAdapter.notifyDataSetChanged();
    }    公共无效NextScreen(INT位置,标题字符串,字符串的文件,
            字符串标记名){        如果(FragmentList.size()>位置 - 1){
            对于(INT I = FragmentList.size() - 1; I>位置;我 - ){
                titles.remove(ⅰ);
                FragmentList.remove(ⅰ);
            }
            titles.trimToSize();
            FragmentList.trimToSize();
        }        titles.add(职务,职称);
        addPage(位置,文件标记名);
        mViewPager.setAdapter(新SectionsPagerAdapter(fragManager));
        mViewPager.setCurrentItem(位置);
    }    / **
     * A {@link FragmentPagerAdapter}返回对应片段
     *章节/标签/页面。
     * /
    公共类SectionsPagerAdapter扩展FragmentStatePagerAdapter {        公共SectionsPagerAdapter(FragmentManager FM){
            超(FM);
            addPage(0,catlist.xml,PID-0);
        }        @覆盖
        公共片段的getItem(INT位置){
            返回FragmentList.get(位置);        }        公共无效SETID(){        }        @覆盖
        公众诠释的getCount(){
            返回FragmentList.size();
        }        @覆盖
        公众诠释getItemPosition(Object对象){
            返回FragmentList.indexOf(对象);
        }        @覆盖
        公共CharSequence的getPageTitle(INT位置){
            Log.v(titlePosition位置+);
            返回titles.get(位置);
        }
    }    / **
     *一个虚拟片段重新presenting应用程序的一部分,但只是
     *显示虚拟文本。
     * /
    公共静态类DummySectionFragment扩展片段{
        / **
         *片段参数重新presenting本节号
         *片段。
         * /
        公共静态的ArrayList< Xml_Item_Data> resultList =新的ArrayList< Xml_Item_Data>();
        公共静态最后弦乐ARG_SECTION_NUMBER =SECTION_NUMBER;
        公共静态最后弦乐ARG_FILE_NAME =FILE_NAME
        公共静态最后弦乐ARG_FILE_TAG =TAG_NAME;
        ListView的parent_list;
        公共静态捆绑setValues​​方法;        公共DummySectionFragment(){        }        @覆盖
        公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,
                捆绑savedInstanceState){
            savedInstanceState = this.getArguments();
            parent_list =新的ListView(getActivity());
            字符串FILE_NAME = savedInstanceState.getString(ARG_FILE_NAME);
            字符串TAG_NAME = savedInstanceState.getString(ARG_FILE_TAG);
            INT CURRENT_LEVEL = savedInstanceState.getInt(ARG_SECTION_NUMBER);
            PullParser拉=新PullParser(getActivity());
            pull.pullXml(FILE_NAME,TAG_NAME);
            ListAdapter list_Creator =新ListAdapter(getActivity()
                    PullParser.Xml_Tag_Info,CURRENT_LEVEL);
            parent_list.setAdapter(list_Creator);
            返回parent_list;
        }
    }
}

SCENARIO

I am creating a fragment structure with dynamic fragment creations. Each item in the fragment creates the next fragment. In the scenario I am storing all these fragments in the ArrayList of fragments so that I can easily replace the created fragment.

PROBLEM

Now I am replacing a fragment from the ArrayList by removing the fragment from a particular index and adding the new one. But when I try to get the fragment from that particular index it returns me the old data without calling the getItem function of the FragmentStateAdapter again.

Here is my Main class.

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;
}
}

解决方案

I have found the answer just to reinstantiate the adapter after making the necessary changes. The edited code is here.

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;
        }
    }
}

这篇关于从ViewPager机器人更换片段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆