简体   繁体   中英

ViewPager.setCurrentItem Return Wrong Position in PagerAdapter

Here's my tabLayoutCode

mTabLayoutBerita.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
                    @Override
                    public void onTabSelected(TabLayout.Tab tab) {
                        Log.i("onTabSelected", String.valueOf(tab.getPosition()));
                        mViewPagerBerita.setCurrentItem(tab.getPosition());
                    }

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

                    }

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

                    }
                });

And this is in my PagerAdapter

public class PagerBerita extends FragmentPagerAdapter {

    private int mNumOfTabs;
    private FragmentBeritaByKategori fragmentBeritaByKategori = null;
    private List<KategoriItem> mDataListKategoriBerita;

    public PagerBerita(FragmentManager fm, int NumOfTabs, List<KategoriItem> mDataListKategoriBerita) {
        super(fm);
        this.mNumOfTabs = NumOfTabs;
        this.mDataListKategoriBerita = mDataListKategoriBerita;
    }

    @Override
    public Fragment getItem(int position) {

        fragmentBeritaByKategori = new FragmentBeritaByKategori(mDataListKategoriBerita.get(position).getId());
        return fragmentBeritaByKategori;
    }

    @Override
    public int getCount() {
        return mDataListKategoriBerita.size();
    }
}

I'm trying to create dynamic tab layout, but when the tab already showed up, i get wrong data because the position i use in PagerAdapter is wrong. I've already use setOffscreenPageLimit and not working, i'm so confuse. Any solution for this case ? Thanks a lot.

You are forgot to add ViewPager to tab layout.
TabLayout tabsLayout = (TabLayout) findViewById(R.id.tabsLayout);
ViewPager viewpager = (ViewPager) findViewById(R.id.viewpager);
ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
viewpager.setAdapter(adapter);

//Add ViewPager to tab layout.
tabsLayout.setupWithViewPager(viewpager);
viewpager.setOffscreenPageLimit(8);

tabsLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                viewpager.setCurrentItem(tab.getPosition());
                Log.i("TabLayout Position: " + tab.getPosition());

            }

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

            }

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

            }
        });

It working fine.

I do like this, is it wrong ?

final CustomViewPager viewPager = findViewById(R.id.pager);
        final PagerAdapterBottomNavigation pagerAdapterBottomNavigation = new PagerAdapterBottomNavigation(getSupportFragmentManager(), tab_layout.getTabCount());

        viewPager.setAdapter(pagerAdapterBottomNavigation);
        viewPager.setCurrentItem(2);
        viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tab_layout));

        tab_layout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                tab_layout.getTabAt(2).getIcon().setColorFilter(getResources().getColor(R.color.secondaryTextColor), PorterDuff.Mode.SRC_IN);
                tab.getIcon().setColorFilter(getResources().getColor(R.color.secondaryLightColor), PorterDuff.Mode.SRC_IN);
                if(tab.getPosition() == 0) {
                    actionBar.setTitle("Menu");
                } else if(tab.getPosition() == 1) {
                    actionBar.setTitle("News");
                } else if(tab.getPosition() == 2) {
                    actionBar.setTitle("Event");
                } else if(tab.getPosition() == 3) {
                    actionBar.setTitle("Promo");
                } else if(tab.getPosition() == 4) {
                    actionBar.setTitle("Setting");
                }

                viewPager.setCurrentItem(tab.getPosition());
            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {
                tab.getIcon().setColorFilter(getResources().getColor(R.color.secondaryTextColor), PorterDuff.Mode.SRC_IN);
            }

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

            }
        });

My PagerAdapter

public class PagerAdapterBottomNavigation extends FragmentPagerAdapter {
    int mNumOfTabs;
    private FragmentAllMenu fragmentAllMenu;
    private FragmentBerita fragmentBerita;
    private FragmentEvent fragmentEvent;
    private FragmentSetting fragmentSetting;
    private FragmentPromo fragmentPromo;

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

    @Override
    public Fragment getItem(int position) {

        switch (position) {
            case 0:
                fragmentAllMenu = new FragmentAllMenu();
                return fragmentAllMenu;
            case 1:
                fragmentBerita = new FragmentBerita();
                return fragmentBerita;
            case 2:
                fragmentEvent = new FragmentEvent();
                return fragmentEvent;
            case 3:
                fragmentPromo = new FragmentPromo();
                return fragmentPromo;
            case 4:
                fragmentSetting = new FragmentSetting();
                return fragmentSetting;
            default:
                return null;
        }
    }

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

But i check on PagerAdapter getItem(int position), the position wrong but show correct fragment.

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