Search code examples
androidandroid-layoutandroid-fragmentsandroid-recyclerviewandroid-viewpager

Recyclerview inside nested fragment is not showing


I have a fragment which contain a viewpager . The viewpager itself contain fragments which contain recyclerview and textview . The problem is that textview is showing in all 5 tabs but recyclerview only shows at 2-3 tabs(randomly) .

1.jpg

2.jpg

Here is my code

Parent Fragment

@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
toolbar = (Toolbar) fragmentActivity.findViewById(R.id.my_toolbar);
tabLayout = (TabLayout) fragmentActivity.findViewById(R.id.my_tablayout);
mCollapsingToolbarLayout = (CollapsingToolbarLayout)    fragmentActivity.findViewById(R.id.collapsing_toolbar_layout);
viewPager = (ViewPager) fragmentActivity.findViewById(R.id.my_pager);
    ((AppCompatActivity) getActivity()).setSupportActionBar(toolbar);
    ((AppCompatActivity)    getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);
          adapter = new GameListPagerAdapter(getChildFragmentManager(),getContext());
    viewPager.setAdapter(adapter);
    viewPager.setCurrentItem(1);
    tabLayout.setupWithViewPager(viewPager);
}

ViewPager Adapter

public class GameListPagerAdapter extends FragmentStatePagerAdapter {

private final int PAGE_COUNT = 5;
private Context context;
private String pageTitle[] = {"Replaying", "Planning", "dropped", "playing","completed"};

public GameListPagerAdapter(FragmentManager fm, Context context) {
    super(fm);
    this.context = context;
}

@Override
public Fragment getItem(int position) {

    switch (position){

        case 0 :
            return GamesListPagerFragment.newInstance(GiantBomb.REPLAYING);
        case 1 :
            return GamesListPagerFragment.newInstance(GiantBomb.PLANNING);
        case 2 :
            return GamesListPagerFragment.newInstance(GiantBomb.DROPPED);
        case 3 :
            return GamesListPagerFragment.newInstance(GiantBomb.PLAYING);
        case 4:
            return GamesListPagerFragment.newInstance(GiantBomb.COMPLETED);

        default:
            return GamesListPagerFragment.newInstance(position);

    }

}

@Override
public int getCount() {
    return PAGE_COUNT;
}


@Override
public CharSequence getPageTitle(int position) {
    return pageTitle[position];
}


}

Child Fragment containing textview and recyclerveiw

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    Toaster.make(getContext(),"onActivity");
    recyclerView = (RecyclerView) getActivity().findViewById(R.id.recycler_view);
    recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
    realmResult =  realm.where(GameListDatabase.class).findAll();
    Toaster.make(getContext(),realmResult.size()+"");
    GameListAdapter adapter = new GameListAdapter(getContext(),realmResult,true);
    recyclerView.setAdapter(adapter);


}

Solution

  • First of all, don't create new items in your getItem(position) method of your adapter. Instead create a List of fragments and populate it in your Constructor so that you don't create new instances everytime.

    public class GameListPagerAdapter extends FragmentStatePagerAdapter {
    
        private Context context;
        private String pageTitle[] = {"Replaying", "Planning", "dropped", "playing", "completed"};
        private ArrayList<Fragment> fragments;
    
        public GameListPagerAdapter(FragmentManager fm, Context context) {
            super(fm);
            this.context = context;
            fragments = new ArrayList<>();
            fragments.add(GamesListPagerFragment.newInstance(GiantBomb.REPLAYING));
            fragments.add(GamesListPagerFragment.newInstance(GiantBomb.PLANNING));
            fragments.add(GamesListPagerFragment.newInstance(GiantBomb.DROPPED));
            fragments.add(GamesListPagerFragment.newInstance(GiantBomb.PLAYING));
            fragments.add(GamesListPagerFragment.newInstance(GiantBomb.COMPLETED));
        }
    
        @Override
        public Fragment getItem(int position) {
            return fragments.get(position);
        }
    
        @Override
        public int getCount() {
            return fragments.size();
        }
    
        @Override
        public CharSequence getPageTitle(int position) {
            return pageTitle[position];
        }
    }
    

    Also move your following code:

    Toaster.make(getContext(),"onActivity");
        recyclerView = (RecyclerView) getActivity().findViewById(R.id.recycler_view);
        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
        realmResult =  realm.where(GameListDatabase.class).findAll();
        Toaster.make(getContext(),realmResult.size()+"");
        GameListAdapter adapter = new GameListAdapter(getContext(),realmResult,true);
        recyclerView.setAdapter(adapter);  
    

    from your onActivityCreated to your onCreateView method of your child fragment.
    If you don't have many child fragments then you can set your viewPager.setOffscreenPageLimitto the number of fragments you have, in this case 5.