接个吻. 2022-06-27 15:46 采纳率: 93.1%
浏览 57
已结题

Android开发ViewPager+Fragment嵌套ViewPager页面不显示的问题

问题:
Android开发ViewPager2+Fragment,然后Fragment里面在嵌套ViewPager2+Fragment,第一层ViewPager的Fragment正常显示,第二层的ViewPager的Fragment无法显示内容,网上有说相似问题,Fragment的ViewPager要用getChildFragmentManager(),这个我一开始就是用getChildFragmentManager()的,依旧还是不显示,甚至连第二层ViewPager,new出来的Fragment都没有执行过。相关代码如下:

MainActivity的ViewPage:

ArrayList<Fragment> fragments = new ArrayList<>();
fragments.add(new Home());//添加Home的Fragment
fragments.add(new Dynamic());//添加Dynamic的Fragment
fragments.add(new Purchase());//添加Purchase的Fragment
fragments.add(new Me());//添加Me的Fragment
MainFragmentPagerAdapter mainFragmentPagerAdapter = new MainFragmentPagerAdapter(getSupportFragmentManager(),getLifecycle(),fragments);
viewPager.setAdapter(mainFragmentPagerAdapter);
viewPager.setUserInputEnabled(false);

Fragment的ViewPager:

ArrayList<Fragment> fragments = new ArrayList<>();
fragments.add(HomeRecommend.newInstance("哈哈"));//添加HomeRecommend的Fragment,为了测试这个问题暂时只创建了一个Fragment
fragments.add(HomeRecommend.newInstance("你好"));//添加HomeRecommend的Fragment,为了测试这个问题暂时只创建了一个Fragment
fragments.add(HomeRecommend.newInstance("牛逼"));//添加HomeRecommend的Fragment,为了测试这个问题暂时只创建了一个Fragment
fragments.add(HomeRecommend.newInstance("666"));//添加HomeRecommend的Fragment,为了测试这个问题暂时只创建了一个Fragment
HomeFragmentPagerAdapter mainFragmentPagerAdapter = new HomeFragmentPagerAdapter(getChildFragmentManager(),getLifecycle(),fragments);
homeViewPager.setAdapter(mainFragmentPagerAdapter);

HomeRecommend类被创建后执行的代码:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
     if (root == null) {
         root = inflater.inflate(R.layout.fragment_home_recommend, container, false);
     }
     initView();
     initData();
     System.out.println(meStringText + "被执行了");//meStringText就是HomeRecommend.newInstance()传进来的参数
     //注意:我前面第二层ViewPager是有add了4个HomeRecommend的,但是他们一次都没有被打印出来
     return root;
}

MainFragmentPagerAdapter和HomeFragmentPagerAdapter类的代码,两个类都是相同的代码,所以只贴一个出来


public class MainFragmentPagerAdapter extends FragmentStateAdapter {

    private List<Fragment> fragmentList = new ArrayList<>();

    public MainFragmentPagerAdapter(@NonNull FragmentManager fragmentManager, @NonNull Lifecycle lifecycle,List<Fragment> fragments) {
        super(fragmentManager, lifecycle);
        this.fragmentList = fragments;
    }


    @NonNull
    @Override
    public Fragment createFragment(int position) {
        return fragmentList.get(position);
    }

    @Override
    public int getItemCount() {
        return fragmentList.size();
    }
}

运行效果如下:

img

  • 写回答

1条回答 默认 最新

  • yung7086 2022-06-28 16:34
    关注

    看了下我自己项目,你的业务和我一样,代码逻辑也一致, 只有我的adapter不一样, 时间久远 .我忘记我的adapter为什么这样写,好像是因为,调用notify时候无法刷新才加,的,建议你试试我的

    
    
    import androidx.fragment.app.Fragment;
    import androidx.fragment.app.FragmentManager;
    import androidx.fragment.app.FragmentStatePagerAdapter;
    import androidx.fragment.app.FragmentTransaction;
    import androidx.viewpager.widget.PagerAdapter;
    import android.view.ViewGroup;
    
    import java.util.List;
    
    public class MainAdapter extends FragmentStatePagerAdapter {
    
        private List<Fragment> list;
        FragmentManager fm;
        boolean[] fragmentsUpdateFlag = { false, false, false, false };
    
        public MainAdapter(FragmentManager fm, List<Fragment> list) {
            super(fm);
            this.fm = fm;
            this.list = list;
        }
    
        @Override
        public Fragment getItem(int position) {
            return list.get(position%list.size());
        }
    
        @Override
        public int getCount() {
            return list.size();
        }
    
        @Override
        public int getItemPosition(Object object) {
            return PagerAdapter.POSITION_NONE;
        }
    
        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            // 得到缓存的fragment
            Fragment fragment = (Fragment) super.instantiateItem(container,position);
            // 得到tag,这点很重要
            String fragmentTag = fragment.getTag();
            if (fragmentsUpdateFlag[position % fragmentsUpdateFlag.length]) {
                // 如果这个fragment需要更新
                FragmentTransaction ft = fm.beginTransaction();
                // 移除旧的fragment
                ft.remove(fragment);
                // 换成新的fragment
                fragment = list.get(position % list.size());
                // 添加新fragment时必须用前面获得的tag,这点很重要
                ft.add(container.getId(), fragment, fragmentTag);
                ft.addToBackStack(position+"w");
                ft.attach(fragment);
                ft.commit();
                // 复位更新标志
                fragmentsUpdateFlag[position % fragmentsUpdateFlag.length] = false;
            }
    
            return fragment;
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 7月7日
  • 已采纳回答 6月29日
  • 修改了问题 6月27日
  • 创建了问题 6月27日

悬赏问题

  • ¥15 用verilog实现tanh函数和softplus函数
  • ¥15 Hadoop集群部署启动Hadoop时碰到问题
  • ¥15 求京东批量付款能替代天诚
  • ¥15 slaris 系统断电后,重新开机后一直自动重启
  • ¥15 QTableWidget重绘程序崩溃
  • ¥15 谁能帮我看看这拒稿理由啥意思啊阿啊
  • ¥15 关于vue2中methods使用call修改this指向的问题
  • ¥15 idea自动补全键位冲突
  • ¥15 请教一下写代码,代码好难
  • ¥15 iis10中如何阻止别人网站重定向到我的网站