David Velasquez
David Velasquez

Reputation: 2366

ViewPager with TabLayout not displaying my list from recyclerview when I move beyond it's adjacent pages

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

Answers (1)

H Raval
H Raval

Reputation: 1903

change your code

if(mGameAdapter == null)
        {
            mGameAdapter = new GameAdapter();
            mAllGamesRecyclerView.setAdapter(mGameAdapter);
        }

to

    mGameAdapter = new GameAdapter();
    mAllGamesRecyclerView.setAdapter(mGameAdapter);

Upvotes: 1

Related Questions