查看页程序 + 片段状态页管理器适配器 + 片段不起作用



我有一个包含一些项目的片段列表。如果我单击一个项目,将打开相应的片段,其中包含一个查看页。到目前为止没有问题,但是如果我返回列表并再次单击该项目,则不再调用方法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);
    }

最新更新