我有一个包含一些项目的片段列表。如果我单击一个项目,将打开相应的片段,其中包含一个查看页。到目前为止没有问题,但是如果我返回列表并再次单击该项目,则不再调用方法getItem(int position)。
这里有一个类似问题的链接:
在片段内显示片段
查看页
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
view = inflater.inflate(R.layout.activity_fragment_runtime, container, false);
mViewPager = (ViewPager) view.findViewById(R.id.pager);
indicator = (TitlePageIndicator) view.findViewById(R.id.indicator);
MyFragmentPagerAdapter mMyFragmentPagerAdapter = new MyFragmentPagerAdapter(getActivity().getSupportFragmentManager());
mViewPager.setAdapter(mMyFragmentPagerAdapter);
indicator.setViewPager(mViewPager);
return view;
}
class MyFragmentPagerAdapter extends FragmentStatePagerAdapter implements TitleProvider {
public MyFragmentPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public String getTitle(int position) {
return muxbusTitles[position];
}
@Override
public Fragment getItem(int location) {
return muxbusFragmentList.get(location);
}
@Override
public int getCount() {
return muxbusTitles.length;
}
}
return view;
}
编辑:如果有人感兴趣,解决方案是从PagerAdapter扩展而不是FragmentStatePagerAdpater,因为Viewpager已经在Fragment中。
我确实遇到了类似的问题,在挠头很长一段时间后,我做出了自己的理解(假设),即ViewPager
将其子片段的引用保留到内存中,即使托管Fragment or Activity
被销毁(未使用 Activity 进行测试)。所以我freeFragmentsFromViewPager()
写了这个方法。您需要从onDestroy()
Fragment
中调用它。
/**
* This method free the child fragments from ViewPager as ViewPager keeps the reference
* of child fragments into memory and next time when you again come to visit view pager it won't show the fragment layout
* because it has the reference to the fragment whilst the fragment's view was already destroyed.
*/
private void freeFragmentsFromViewPager()
{
for(int i = 0; i < TabsFragmentPagerAdapter.fragments.length; i++)
{
Fragment fragment = TabsFragmentPagerAdapter.fragments[i];
if(fragment != null)
{
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.remove(fragment);
fragmentTransaction.commit();
TabsFragmentPagerAdapter.fragments[i] = null;
}
}
}
这是我的适配器代码
public class TabsFragmentPagerAdapter extends FragmentPagerAdapter
{
public static final int NUM_TABS = 3;
public static Fragment[] fragments = new Fragment[NUM_TABS];
public TabsFragmentPagerAdapter(FragmentManager fm)
{
super(fm);
}
@Override
public Fragment getItem(int position)
{
Log.e("TabsFragmentPagerAdapter", "getItem");
Fragment fragment = TabsFragmentFactory.newInstace(position);
fragments[position] = fragment;
return fragment;
}
@Override
public int getCount()
{
return NUM_TABS;
}
@Override
public CharSequence getPageTitle(int position)
{
return TabsFragmentFactory.getName(position);
}