viewpager布局复用中FragmentPagerAdapter的坑,源码分析,控件id的一些思考

在使用FragmentPagerAdapter时遇到布局复用问题,导致部分Fragment的ViewPager显示为空。分析源码发现,由于ViewPager的ID相同,使FragmentPagerAdapter误以为fragment已初始化,未重新调用getItem。通过改变ViewPager的ID解决问题。此外,探讨了控件ID的生成和使用,指出在大型项目中手动设置ID可能导致重复,但同一布局内的ID不会冲突。尝试重写instantiateItem方法设置唯一标识未成功,源码显示对有效ID的理解存在分歧。
摘要由CSDN通过智能技术生成

一个fragment的布局复用,里面是tablayout+viewpager,viewpager加载不同adapter,adapter继承FragmentPageAdapter。运行后有问题,先初始化的fragment正常显示,后加载的fragment里的viewpager全部是空白,这就很尴尬了,第一反应是fragment没add进FragmentManager,因为在同一个activity里,所以只有一个FragmentManager,debug一下。

List<Fragment> fragments = getSupportFragmentManager().getFragments();

果然第二个viewpager里的fragment一个都没add,继续查问题。FragmentPageAdapter是通过getItem(position)获取fragment对象的,并且已初始化过得fragment不会再次调用,会从FragmentManager中取出来,debug发现第二个getItem并未被调用,问题很明显,FragmentPageAdapter认为对应position的fragment已经初始化过了,不重新调用,好吧,查源码吧。

 @Override
    public Object instantiateItem(ViewGroup container, int position) {
        if (mCurTransaction == null) {
            mCurTransaction = mFragmentManager.beginTransaction();
        }

        final long itemId = getItemId(position);

        // Do we already have this fragment?
        String name = makeFragmentName(container.getId(), itemId);
        Fragment fragment = mFragmentManager.findFragmentByTag(name);
        if</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值