0

Hy, I am new to Android developing apps and i want to make an application using a view Pager with tabLayout.I also have a fragment that contains a list and I want to create this fragment on every page but with different data, depending on the tab selected. I almost achieved this but I've got a problem on viewPager page create. My ViewPagerAdapter extemds FragmentStatePagerAdapter and it looks like this:

public class ViewPagerAdapter extends FragmentStatePagerAdapter{
    static final int NUM_ITEMS = 7;


    public ViewPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        Log.e("new instance",position+"");
        Fragment fragment=null;

        switch (position)
        {
            case 0: fragment=new ChannelListFragment();
                Log.e("new instance ",position+"");
                break;
            case 1: fragment= new ChannelListFragment();
                Log.e("new instance ",position+"");

                break;
            case 2: fragment=new ChannelListFragment();
                Log.e("new instance ",position+"");

                break;
            case 3: fragment=new ChannelListFragment();
                Log.e("new instance ",position+"");

                break;
            case 4: fragment=new ChannelListFragment();
                Log.e("new instance ",position+"");

                break;
            case 5: fragment=new ChannelListFragment();
                Log.e("new instance ",position+"");

                break;
            case 6: fragment=new ChannelListFragment();
                Log.e("new instance ",position+"");

                break;

        }
        return fragment;
    }

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

In my MainActivity I am doing this:

 viewPager = (ViewPager) findViewById(R.id.pager);
        final ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());

        viewPager.setAdapter(adapter);

        viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
        tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                viewPager.setCurrentItem(tab.getPosition());

            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {

            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {

            }
        });

    }

the problem is on swiping the pages: when activity first creates, on logs I saw that creates position 0 and position 1 for the first page, after that it creates position 2 for second tab, position 3 for third tab, 4 ,5,6 for the sixth tab and for the last one doesn't do enything. On scroll back is creating 4,3,2,1,0 and nothing for the first fragment. This affects the functionality of the app when setting the data depending on the selected tab. Can you help me please to fix it so that the pager to create one fragment on a page including item 0 and item six, the last one?

abhishesh
  • 3,246
  • 18
  • 20
Mikky
  • 53
  • 4
  • Possible duplicate of [Refresh data in ViewPager Fragment](http://stackoverflow.com/questions/36503779/refresh-data-in-viewpager-fragment) Basically, the ViewPager keeps the current Fragment and a Fragment on either side alive in order to keep fast swiping smooth. If you need to do something in each Fragment when it loads, then use the method described in the linked answer. – Daniel Nugent Sep 19 '16 at 18:37

1 Answers1

0
        viewPager = (ViewPager) findViewById(R.id.pager);
        final ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());

        viewPager.setAdapter(adapter);
        tabLayout.setupWithViewPager(viewPager) // link the given ViewPager and this TabLayout together so that changes in one are automatically reflected in the other
        viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));

    }

By default, either side of current page are created and cached, so that to have a good user experience when user scrolls the current page to left or right. In your case, when first page loads(page 1 and 2 are created) When you swipe to 2nd page, 1 and 2 are already in memory and hence only page to right ie third page is loaded and so on.

Please visit link for more information.

Also tablayout provides a convenient method setUpWithViewPager for linking viewpager and tablayout. You can use this method instead of manually setting the current item.

abhishesh
  • 3,246
  • 18
  • 20