Reputation: 2366
This is what my app is doing. I have four tabs using TabLayout
in a FragmentPagerAdapter
: A, B, C, and D. I have data displayed at B only. The app starts up at tab B. From tab B I can page left to A, then go page back to tab B and the data is still displayed fine. Then from tab B I can page right to tab C and go back to tab B and the data is also displayed fine. But once I page to tab D and then page back to tab B, the page becomes completely empty. My RecyclerView
list that was displayed is no longer displaying anything. I'm new to using FragmentPagerAdapter
and TabLayout
(and Android programming in general) so I apologize if my code is bad or something.
By the way my ViewPager
is inside of an Activity (the individual pages are Fragments though, hope that wasn't confusing) so I couldn't use getChildFragmentManager()
that a lot of answers were suggesting (unless I'm doing that wrong). I've read many of the answers on viewpager here but it doesn't seem like they were having the same problem as me. Here is my code:
MainActivity:
public class MainActivity extends AppCompatActivity
{
private Toolbar mToolbar;
private ViewPager mViewPager;
private TabLayout mTabLayout;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mToolbar = (Toolbar) findViewById(R.id.toolbar);
mViewPager = (ViewPager) findViewById(R.id.main_activity_view_pager);
mTabLayout = (TabLayout) findViewById(R.id.main_activity_tab_layout);
setSupportActionBar(mToolbar);
assert getSupportActionBar() != null;
getSupportActionBar().setDisplayShowTitleEnabled(false);
NavDrawerFragment navDrawerFrag = (NavDrawerFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_nav_drawer);
navDrawerFrag.setUp((DrawerLayout)findViewById(R.id.nav_drawer), mToolbar);
setupViewPagerAdapter(mViewPager);
mTabLayout.setupWithViewPager(mViewPager);
mTabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener()
{
@Override
public void onTabSelected(TabLayout.Tab tab)
{
mViewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(TabLayout.Tab tab)
{
}
@Override
public void onTabReselected(TabLayout.Tab tab)
{
}
});
private void setupViewPagerAdapter(ViewPager viewPager)
{
MainPagerAdapter pagerAdapter = new MainPagerAdapter(getSupportFragmentManager());
//order is very important here; they correspond to the tab position from left to right
pagerAdapter.addFragment(MyGamesFragment.newInstance(), "My Games");
pagerAdapter.addFragment(AllGamesFragment.newInstance(), "All Games");
pagerAdapter.addFragment(AllPlacesFragment.newInstance(), "All Places");
pagerAdapter.addFragment(MyPlacesFragment.newInstance(), "My Places");
viewPager.setAdapter(pagerAdapter);
viewPager.setCurrentItem(1);
}
MainPagerAdapter (FragmentPagerAdapter class):
public class MainPagerAdapter extends FragmentPagerAdapter
{
private final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();
public MainPagerAdapter(FragmentManager fm)
{
super(fm);
}
@Override
public Fragment getItem(int position)
{
return mFragmentList.get(position);
}
@Override
public int getCount()
{
return mFragmentList.size();
}
@Override
public CharSequence getPageTitle(int position)
{
return mFragmentTitleList.get(position);
}
public void addFragment(Fragment fragment, String title)
{
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
}
}
My Fragment (this represents "tab B" in my explanation above):
public class AllGamesFragment extends Fragment
{
private static final String ARG_ALLGAMES_FRAG_ID = "all_games_frag_id";
RecyclerView mAllGamesRecyclerView;
GameAdapter mGameAdapter;
public static AllGamesFragment newInstance()
{
return new AllGamesFragment();
}
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
View view = inflater.inflate(R.layout.all_games_recycler_view, container, false);
mAllGamesRecyclerView = (RecyclerView) view.findViewById(R.id.all_games_recycler_view);
mAllGamesRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
updateList();
return view;
}
@Override
public void onResume()
{
super.onResume();
updateList();
}
private void updateList()
{
if(mGameAdapter == null)
{
mGameAdapter = new GameAdapter();
mAllGamesRecyclerView.setAdapter(mGameAdapter);
}
}
private class GameHolder extends RecyclerView.ViewHolder implements View.OnClickListener
{
private TextView mTeamOne, mTeamTwo, mGameStartTime;
private ImageView mTeamOneLogo, mTeamTwoLogo;
public GameHolder(View itemView)
{
super(itemView);
itemView.setOnClickListener(this);
mTeamOne = (TextView) itemView.findViewById(R.id.team_one_name);
mTeamTwo = (TextView) itemView.findViewById(R.id.team_two_name);
mTeamOneLogo = (ImageView) itemView.findViewById(R.id.team_one_logo);
mTeamTwoLogo = (ImageView) itemView.findViewById(R.id.team_two_logo);
mGameStartTime = (TextView) itemView.findViewById(R.id.game_time);
}
@Override
public void onClick(View v)
{
}
}
private class GameAdapter extends RecyclerView.Adapter<GameHolder>
{
@Override
public GameHolder onCreateViewHolder(ViewGroup parent, int viewType)
{
LayoutInflater inflater = LayoutInflater.from(getActivity());
View view = inflater.inflate(R.layout.list_game_item, parent, false);
return new GameHolder(view);
}
@Override
public void onBindViewHolder(GameHolder holder, int position)
{
}
@Override
public int getItemCount()
{
return 10;
}
}
As you can see I'm not using actual data yet, I'm just trying to get UI working fine.
Upvotes: 3
Views: 1431
Reputation: 1903
change your code
if(mGameAdapter == null)
{
mGameAdapter = new GameAdapter();
mAllGamesRecyclerView.setAdapter(mGameAdapter);
}
to
mGameAdapter = new GameAdapter();
mAllGamesRecyclerView.setAdapter(mGameAdapter);
Upvotes: 1