ViewPager + Fragment 架构中如何处理预加载问题

本文探讨了ViewPager在结合Fragment使用时遇到的预加载问题,由于默认缓存机制,导致内存占用过多。文章深入分析了ViewPager的加载流程,特别是Fragment的setUserVisibleHint方法的作用。虽然提供了一些代码示例,但并未解决双层嵌套的预加载问题。通过理解这些原理,开发者可以更好地控制Fragment的加载策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、由于ViewPager设置setOffscreenPageLimit(0)无效,导致当前缓存的Fragment的数量总是 limit * 2 + 1 个,
在这里插入图片描述

假设 setOffscreenPageLimit(1)设置的是1,然后当前选中的是第一个Item,此时它也会把下一个Item对应的Fragment加载出来,并且走完该有的声明周期,如上图所示
二、分析原因是因为,这个是ViewPager的机制,始终会至少缓存2个Fragment,如何处理这个问题呢,接下来分析。
首先,搞明白整个调用流程,当我们调用 mViewPager.setAdapter(adapter);之后,紧接着就会调用populate(int newCurrentItem)方法,然后调用此方法
mAdapter.instantiateItem(this, position);这个方法中最终会调用到Fragment的setUserVisibleHint(boolean isVisibleToUser)这个方法。这个方法中的参数 isVisibleToUser 表示当前Fragment是否显示。
在这里插入图片描述
下面此图是 setUserVisibleHint 此方法真正的执行流程
在这里插入图片描述
三、为了解决上面的问题,看下面的代码,注意下面代码没有解决,ViewPager 嵌套Fragment,Fragment里面又嵌套ViewPager的情况,也就是双层嵌套。
宿主Activity的代码:

public class ViewPagerActivity extends AppCompatActivity {
    ViewPager mViewPager;
    private BottomNavigationView bottomNavigationView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_view_pager);
        mViewPager = findViewById(R.id.viewPager);
        bottomNavigationView = findViewById(R.id.bottomNavigationView);
        bottomNavigationView.setOnNavigationItemSelectedListener(onNavigationItemSelectedListener);
        List<Fragment> fragmentList = new ArrayList<>();
        fragmentList.add(MyFragment.newInstance(1));
        fragmentList.add(MyFragment.newInstance(2));
        fragmentList.add(MyFragment.newInstance(3));
        fragmentList.add(MyFragment.newInstance(4));
        fragmentList.add(MyFragment.newInstance(5));
        MyFragmentPagerAdapter adapter = new MyFragmentPagerAdapter(getSupportFragmentManager(),fragmentList);
        mViewPager.setAdapter(adapter);
        mViewPager.setOffscreenPageLimit(1);
        mViewPager.setOnPageChangeListener(viewpagerChangeListener);
    }

    ViewPager.OnPageChangeListener viewpagerChangeListener = new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int i, float v, int i1) { }

        @Override
        public void onPageSelected(int i) {
            int itemId = R.id.fragment_1;
            switch (i) {
                case 0:
                    itemId = R.id.fragment_1;
                    break;
                case 1:
                    itemId = R.id.fragment_2;
                    break;
                case 2:
                    itemId = R.id.fragment_3;
                    break;
                case 3:
                    itemId = R.id.fragment_4;
                    break;
                case 4:
                    itemId = R.id.fragment_5;
                    break;
            }
            bottomNavigationView.setSelecte
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值