2

I have a TabLayout and ViewPager in my android application. But when i use swipe for changing "Tab1" to "Tab2" and use click on "Tab1" to go back to first tab then fragment inside my viewpager is not updated.

Similar problem exist if i use swipe to move from "Tab2" to "Tab3" and then try to click on tab to move back to Tab2.

Otherwise the TabLayout works fine all tabs will be updated and proper fragments are shown if i use any other combination of swipes or clicks.

        //set tabs and viewpager
    ViewPager viewPager = (ViewPager) findViewById(R.id.mViewPager);
    viewPager.setAdapter(new MyFragmentPageAdapter(getSupportFragmentManager(), MainActivity.this));

    //layout
    TabLayout tabLayout= (TabLayout) findViewById(R.id.mTabs);
    tabLayout.setupWithViewPager(viewPager);
sohaib
  • 31
  • 1
  • 3

3 Answers3

2

You should implement setOnTabSelectedListener :

tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
           viewPager.setCurrentItem(tab.getPosition());
        }
});
Kushal
  • 8,100
  • 9
  • 63
  • 82
  • @DanielNugent Do you have an example or site showing the correct way of implementing this as I am running into the same thing? – Micah Montoya Jun 28 '16 at 14:15
  • @clumsy have a look at my answer here: http://stackoverflow.com/questions/36503779/refresh-data-in-viewpager-fragment – Daniel Nugent Jun 28 '16 at 15:31
2

Its late but i figured a best way out using FragmentPagerAdapter

First in all of the fragments used in the viewpager create method as below.

public void updateView() {
  //Update whatever views or data you want to update
}

Also override method setUserVisibleHint which is used in FragmentPagerAdapter to notify if the fragment is visible to user or not.

 @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        this.isVisibleToUser = isVisibleToUser;
        super.setUserVisibleHint(isVisibleToUser);
    }

finally in your fragment add the following code to update the view/date when the fragment is visible.

@Override
    public void onStart() {
            if (isVisibleToUser)
                updateView();
    }

Then implement this in your TabFragment or Activity

viewpager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {

                switch (position) {
                    case 0: {
                         ((Fragment) mFragmentList.get(0)).updateView();
                        break;
                    }
                    case 1: {
                         ((Fragment) mFragmentList.get(1)).updateView();
                        break;
                    }
                }
            }

This will take care of update the data consistantly, either you swipe or you click the tab, its well tested , if anyone finds any issues or bugs, please comment and let me know or feel free to edit the solution.

PravinDodia
  • 3,271
  • 1
  • 18
  • 22
0

try this

mViewPager.setOffscreenPageLimit(2); // if you use 3 tabs 
mViewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
            @Override
            public void onPageSelected(int position) {
                mTabLayout.getTabAt(position).select();
            }
});

watch out with mViewPager.setOffscreenPageLimit(2); the default values is 1 but I had some trouble using it with a recyclerview

Tudor
  • 1,510
  • 1
  • 18
  • 17