简体   繁体   中英

Fragments not refreshing on swiping tabs in TabLayout

We are working on a project where there are four tabs inside a tablayout.Each of the four tabs are Fragments and have web services called in them on their loading.We need the web service to be called again so that we can refresh the Fragments on swiping. But when the first fragment is loaded and when I swipe the tabs and come back to the first fragment it is not refreshing.The following is what we have tried till now:

tabLayout = (TabLayout) findViewById(R.id.tablayout);

  tabLayout.addTab(tabLayout.newTab().setCustomView(tabView));
            tabLayout.addTab(tabLayout.newTab().setText("TAB 1"));
            tabLayout.addTab(tabLayout.newTab().setText("TAB 2"));
            tabLayout.addTab(tabLayout.newTab().setText("TAB 3"));
            tabLayout.addTab(tabLayout.newTab().setText("TAB 4"));
            tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
            final ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
            final PagerAdapter adapter = new PagerAdapter
                    (getSupportFragmentManager(), tabLayout.getTabCount());
            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 adapter class:

public class PagerAdapter extends FragmentStatePagerAdapter {
    int mNumOfTabs;

    public PagerAdapter(FragmentManager fm, int NumOfTabs) {
        super(fm);
        this.mNumOfTabs = NumOfTabs;
    }

    @Override
    public Fragment getItem(int position) {

        switch (position) {
            case 0:
                TabFragment2015 tab1 = new TabFragment2015();
                return tab1;
            case 1:
                TabFragmentXchanges tab2 = new TabFragmentXchanges();
                return tab2;
            case 2:
                TabFragmentToday tab3 = new TabFragmentToday();
                return tab3;
            case 3:
                TabFragment2016 tab4=new TabFragment2016();
                return tab4;
            default:
                return null;
        }
    }

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

There are four tabs used.I am making the third tab load first by using the following code:

tabLayout.setScrollPosition(2, 0f, true);
            viewPager.setCurrentItem(2);

When i swipe to the second tab from the thrid tab and then open the third tab again, the fragment doesnt reload.But if i swipe to the first tab and then open the third tab it refreshes.I want the tab to refresh on each swipe.Please help..

Simply you jsut have to add the following code :

tabLayout = (TabLayout) findViewById(R.id.tablayout);

tabLayout.addTab(tabLayout.newTab().setCustomView(tabView));
        tabLayout.addTab(tabLayout.newTab().setText("TAB 1"));
        tabLayout.addTab(tabLayout.newTab().setText("TAB 2"));
        tabLayout.addTab(tabLayout.newTab().setText("TAB 3"));
        tabLayout.addTab(tabLayout.newTab().setText("TAB 4"));
        tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
        final ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
        final PagerAdapter adapter = new PagerAdapter
                (getSupportFragmentManager(), tabLayout.getTabCount());
        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());
                adapter.refreshFragment(tab.getPosition())

            }

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

            }

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

            }
        });

The adapter class:

public class PagerAdapter extends FragmentStatePagerAdapter {
int mNumOfTabs;
TabFragment2015 tab1;
TabFragmentXchanges tab2;
TabFragmentToday tab3;
TabFragment2016 tab4;
public PagerAdapter(FragmentManager fm, int NumOfTabs) {
    super(fm);
    this.mNumOfTabs = NumOfTabs;
}

@Override
public Fragment getItem(int position) {

    switch (position) {
        case 0:
            tab1 = new TabFragment2015();
            return tab1;
        case 1:
             tab2 = new TabFragmentXchanges();
            return tab2;
        case 2:
             tab3 = new TabFragmentToday();
            return tab3;
        case 3:
             tab4=new TabFragment2016();
            return tab4;
        default:
            return null;
    }
}

public void refreshFragment(int position) {
    switch (position) {
            case 1:
            tab1.refreshApi();
            break;
        case 2:
            tab2.refreshApi();
            break;
        case 3:
            tab3.refreshApi();
            break;
        case 4:
            tab4.refreshApi();
            break;
    }
  }

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

And add the following method in all the four fragments:

public void refreshApi(){
    //write the code here to refresh your Api
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM