Viewpager + FragmentStatePagerAdapter +片段不工作 [英] Viewpager + FragmentStatePagerAdapter + Fragment not working

查看:118
本文介绍了Viewpager + FragmentStatePagerAdapter +片段不工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一些项FragmentList。如果我点击一个项目的相应片段将打开其中包含一个Viewpager。没问题,但迄今为止,如果我回到列表并单击该项目再次方法的getItem(INT位置)不再被调用。结果
这里有一个类似的问题链接:结果
<一href=\"http://stackoverflow.com/questions/7700226/display-fragment-viewpager-within-a-fragment\">Display片段中的片段viewpager 结果

I have a FragmentList with some items. If I click an item the appropriate Fragment will open which contains a Viewpager. No problem so far but if I go back to the List and click the item again the method getItem(int position) is not called anymore.
Here a link with a similar problem:
Display fragment viewpager within a fragment

@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已经是一个片段。

If someone is interested,the solution was to extends from PagerAdapter instead of FragmentStatePagerAdpater because the Viewpager is already in a Fragment..

推荐答案

我也有类似的问题,抓我的头很长一段时间我做了我的自己的理解(假设)后 ViewPager 是保持它的子片段的参考到内存中,即使托管片段或活动被销毁(不与活动测试)。所以我写了这个方法 freeFragmentsFromViewPager()。你需要从的onDestroy称之为()你的片段

I did have similar problem and after scratching my head for quite some time i made an my own understanding (assumption) that ViewPager is keeping the reference of its child fragments into memory even the hosted Fragment or Activity is destroyed (didn't tested with Activity). So i wrote this method freeFragmentsFromViewPager(). You need to call it from onDestroy() of your 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;
            }       
        }   
    }

这是我的适配器code

And this is my Adapter code

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

这篇关于Viewpager + FragmentStatePagerAdapter +片段不工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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