从ViewPager android替换片段

Posted

技术标签:

【中文标题】从ViewPager android替换片段【英文标题】:Replacing a fragment from ViewPager android 【发布时间】:2013-01-31 01:38:29 【问题描述】:

场景

我正在创建一个带有动态片段创建的片段结构。片段中的每个项目都会创建下一个片段。在场景中,我将所有这些片段存储在片段的 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;


【问题讨论】:

【参考方案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;
        
    

【讨论】:

【参考方案2】:

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

【讨论】:

但我想替换片段的内容,不想让它为空或不可用,返回位置无

以上是关于从ViewPager android替换片段的主要内容,如果未能解决你的问题,请参考以下文章

如何从(和替换)TabLayout 和 ViewPager 移动到新片段?

Android:将“ViewPager”动画从片段更改为片段

ViewPager - 将数据从片段发送到活动时出现 Android 错误 setCurrentItem(int,boolean)

替换 Viewpager 中的片段 [重复]

如何确定 Fragment 何时在 ViewPager 中可见

viewpager 中的 3 个 android 片段,如何让它们全部存活?