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) .
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);
}
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.setOffscreenPageLimit
to the number of fragments you have, in this case 5.