FragmentPagerAdapter/FragmentStatePagerAdapter/PagerAdapter

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FragmentPagerAdapter/FragmentStatePagerAdapter/PagerAdapter相关的知识,希望对你有一定的参考价值。

参考技术A 一,FragmentPagerAdapter:
1.通过setOffscreenpageLimit(int n),来控制cache的数量,n*2+1个;
2,当加载的page超出cache 的数量,会通过fragmentManager来释放fragment;
3,被释放的fragment实际上不会被完全回收,因为没有调用onDestory(),当再次回到这个page时也没有调用onCreate();
4,当fragment被显示在屏幕上时,setUserVisibleHint为true,不显示时为false.

适用于:
page是固定的,并且数量比较少,因为fragment不会被完全回收

二,FragmentStatePagerAdapter
其他三点都一样,不同的是
被释放的fragment会被完全回收,调用了onDestory()的方法;
适用于:
比较多的fragment,保证回收,清理内存

共同点:instantiateItem方法会调用getItem方法获取fragemnt;

当是FragmentStatePagerAdapter有一个缓存fragment的list,fragments,在instantiateItem方法中会先从fragments中获取,没有获取到,再通过getItem等相关方法去获取,在通过fragmentTrasaction添加到container中;

三,PagerAdapter

viewPager.setAdapter(pageradapter),里面调用mAdapter.startUpdate(this);
把viewPager传入到PagerAdapter中

详细的pagerAdapter可以看我这篇文章: https://www.jianshu.com/p/145a15b4425a

附带pagerAdapter的一个封装

instantiateItem方法,可以是一个view,也可以是一个fragment,比如FragmentStatePagerAdapter/FragmentPagerAdapter返回的是一个fragment

四。总结
三个Adapter使用场景分析
PagerAdapter:当所要展示的视图比较简单时适用
FragmentPagerAdapter:当所要展示的视图是Fragment,并且数量比较少时适用
FragmentStatePagerAdapter:当所要展示的视图是Fragment,并且数量比较多时适用

使用 FragmentPagerAdapter 的 FragmentTransaction

【中文标题】使用 FragmentPagerAdapter 的 FragmentTransaction【英文标题】:FragmentTransaction with FragmentPagerAdapter 【发布时间】:2013-11-26 09:34:55 【问题描述】:

我使用 FragmentPagerAdapter 来管理 3 个 Fragment。

public class SectionsPagerAdapter extends FragmentPagerAdapter 

    public SectionsPagerAdapter(FragmentManager fm) 
        super(fm);
    

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) 
    

    @Override
    public Fragment getItem(int position) 
        // getItem is called to instantiate the fragment for the given page.
        Fragment fragment = new Fragment();
        switch (position) 
            case 0:
                return fragment = new Latest();
            case 1:
                return fragment = new MySets();
            case 2:
                return fragment = new MyPictures();
            default:
                break;
        
        return fragment;
    

    @Override
    public int getCount() 
        // Show 3 total pages.
        return 3;
    

    @Override
    public CharSequence getPageTitle(int position) 
        //SET TITLE OF TABS
        Locale l = Locale.getDefault();
        switch (position) 
            case 0:
                return getString(R.string.title_section1_latest).toUpperCase(l);
            case 1:
                return getString(R.string.title_section2_mysets).toUpperCase(l);
            case 2:
                return getString(R.string.title_section3_allpictures).toUpperCase(l);
        
        return null;
    

所有片段都扩展片段。使用扩展 BaseAdapter 的适配器处理点击事件和自定义布局。 我的目标是通过另一个 Fragment 替换 Fragment 2。我必须使用 FragmentTransaction 添加所有 Fragments 以稍后替换它们是否正确?

但是如何动态添加片段以使用 FragmentTransaction?有没有办法将它们添加到 getItem(int position) 或者这是错误的方法?

【问题讨论】:

【参考方案1】:

编辑

如果您在应用程序启动后立即需要 Fragment,那么您在上面在 getItem() 中使用的方法是可以的,您不需要从那里进行交易。

如果您想稍后替换 Fragment,只需使用 getSupportFragmentManger 和 Fragment 中的事务。

            NewFragment newFrag = new NewFragment();
    FragmentTransaction transaction = getActivity()
            .getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.your_fragment_container_id, newFrag);
    transaction.addToBackStack(null);
    transaction.commit();

【讨论】:

但是我可以在哪里以及如何在“需要时”添加片段?在 SectionPagerAdapter 还是在 Fragment 类中? 如果您在应用程序启动后立即需要该片段,则可以将其添加到 SectionPagerAdapter 中。如果您已经有一个片段并且想要替换那个片段,则将其添加到片段类中。 应用启动后我需要 Fragments。但我不知道如何通过 FragmentTransaction 在 SectionPagerAdapter 添加片段...

以上是关于FragmentPagerAdapter/FragmentStatePagerAdapter/PagerAdapter的主要内容,如果未能解决你的问题,请参考以下文章

android.support.v4.app.FragmentPagerAdapter 不能应用于 android.app.FragmentManager

使用 FragmentPagerAdapter 的 FragmentTransaction

无法更新FragmentPagerAdapter中的片段

为啥我不能从 FragmentPagerAdapter 分离片段?

使用 ViewPager + FragmentPagerAdapter 处理方向更改

ViewPager中的FragmentPagerAdapter,FragmentStatePagerAdapter