2

有很多類似的問題,但他們都沒有解決我的問題。ViewPager + FragmentStatePagerAdapter不按預期工作

我在我的應用程序中嵌套了ViewPager s和嵌套FragmentStatePagerAdapter s。

詳細地說,創建了第一個ViewPager(以4片段適配器爲後盾),其第一個片段包含其他3個片段。

我的問題是,根據一些事件,中間碎片根本沒有顯示。

只要應用程序啓動,一切按預期工作,並顯示正確。

如果我切換父ViewPager的頁面,行爲是不同的基於頁面:如果我從第一個(其中包含嵌套的ViewPager)到第二個,然後回到第一個,仍然一切都按預期工作;如果我去任何其他頁面,然後回到第一個頁面,首先ViewPager變得完全透明,但仍然可以滑動。爲了讓視圖在屏幕上重新繪製,我必須從第1頁到第3頁刷幾次,但不管如何,第二片段都不顯示。它完全透明。

我已經閱讀了很多類似的問題,但找不到任何工作修復。 我現在很困惑,我嘗試了一切。

這裏是我的代碼,以供參考:

父活動:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(...); 

    mCoordinatorLayout = (CoordinatorLayout) findViewById(R.id.feed_coordinator); 
    mFloatingActionButton = (FloatingActionButton) findViewById(R.id.feed_floating_upload); 
    mViewPager = (ViewPager) findViewById(R.id.feed_view_pager); 
    mTabLayout = (TabLayout) findViewById(R.id.feed_tab_layout); 

    setupViewPager(); // this sets adapter to viewpager 
    mTabLayout.setupWithViewPager(mViewPager); 
    setupTabLayout(); 

} 

private class ParentPagerAdapter extends FragmentStatePagerAdapter { 
    public ParentPagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 
    @Override 
    public Fragment getItem(int position) { 
     switch (position) { 
      case 0: 
       return new Frag1(); 
      case 1: 
       return new Frag2(); 
      case 2: 
       return new Frag3(); 
      case 3: 
       return new Frag4(); 
      default: 
       return new Default(); 
     } 
    } 
    @Override 
    public int getCount() { 
     return 4; 
    } 
} 

Frag1是非常相似的:

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 

    View view = inflater.inflate(R.layout.frag1, container, false); 

    [...] 

    mViewPager = (ViewPager) view.findViewById(R.id....); 
    mLinearLayout = (LinearLayout) view.findViewById(R.id....); 

    mFragmentAdapter = new MyFragmentAdapter(getFragmentManager()); 
    mViewPager.setAdapter(mFragmentAdapter); 
    return view; 
} 

private class MyFragmentAdapter extends FragmentStatePagerAdapter { 
    private static final int ITEMS = 3; 
    public MyFragmentAdapter(FragmentManager fm) { 
     super(fm); 
    } 
    @Override 
    public Fragment getItem(int position) { 
     switch (position) { 
      case 0: 
       new Child1(); 
      case 1: 
       new Child2(); 
      case 2: 
       new Child3(); 
      default: 
       return null; 
     } 
    } 
    @Override 
    public int getCount() { 
     return ITEMS; 
    } 
} 

3個孩子的遵循一個非常簡單的實現,他們從服務器獲取數據並將其顯示在RecyclerView中。如果需要,我也會上課。

我真的不知道該怎麼做,似乎沒有任何工作。 任何形式的幫助將非常感謝,謝謝!

+0

嘗試改變 new MyFragmentAdapter(getFragmentManager()); 至 new MyFragmentAdapter(getChildFragmentManager()); – MrDroid

+0

@mohammadawad哦,我的上帝,我不想看起來幼稚或任何東西,但謝謝!我不敢相信!它實際上工作!我會做進一步的測試,並讓你知道這是否明確解決了我的問題。 – Matteo

+0

很高興幫助!我已經將答案放在單獨的答案中,將其標記爲已解答其他答案。 – MrDroid

回答

5

你必須使用getChildFragmentManager()

改變這一行嵌套的片段:

new MyFragmentAdapter(getFragmentManager()); 

要:

new MyFragmentAdapter(getChildFragmentManager());