从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)