navid joe
navid joe

Reputation: 59

android- viewpager setCurrentItem make first fragment not loaded

i'm using viewpager and FragmentPagerAdapter in my application . in the first activity , this is my code :

      viewPager = (ViewPager) findViewById(R.id.viewpager);
    setupViewPager(viewPager);

    tabLayout = (TabLayout) findViewById(R.id.tabs);
    tabLayout.setupWithViewPager(viewPager);

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

private void setupViewPager(ViewPager viewPager) {
    Bundle bundle = new Bundle();
    bundle.putString("id",id);

    Fragment_contacts contact=new Fragment_contacts();
    contact.setArguments(bundle);

    Fragment_info info=new Fragment_info();
    info.setArguments(bundle);

    Fragment_Menu menu=new Fragment_Menu() ;
    menu.setArguments(bundle);

    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
    adapter.addFragment(contact, "تماس با ما");
    adapter.addFragment(info, "درباره ما");
    adapter.addFragment(menu, "منو");
    viewPager.setAdapter(adapter);

}

class ViewPagerAdapter extends FragmentPagerAdapter {
    private final List<Fragment> mFragmentList = new ArrayList<>();
    private final List<String> mFragmentTitleList = new ArrayList<>();

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

    @Override
    public Fragment getItem(int position) {
        return mFragmentList.get(position);
    }

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

    public void addFragment(Fragment fragment, String title) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return mFragmentTitleList.get(position);
    }
}

I'm using setCurrentItem because my application is no in english and the default selected tab should be on the right .

When I use setCurrentItem , the Fragment_contacts is not loading and it's not showing any thing , but when I remove setCurrentItem , it loads perfectly.

what is the problem ? how can I solve this ?

Upvotes: 1

Views: 1468

Answers (2)

sohan shetty
sohan shetty

Reputation: 310

Your ViewPager will take some time at initialization before you could use setCurrentItem. So set it after the intialization of your ViewPager by calling it in a thread, like this:

viewPager.post(new Runnable() {
    @Override
    public void run() {
        viewPager.setCurrentItem(2);
    }
});

Upvotes: 3

agonist_
agonist_

Reputation: 5032

Instead of keeping reference to your fragment in your activity, try to do the same in your ViewPager

The view pager is probably already initialized when you add your item in the list and there is a kind of "synchronization" issue between the two.

class ViewPagerAdapter extends FragmentPagerAdapter {
    private final List<Fragment> mFragmentList = new ArrayList<>();
    private final List<String> mFragmentTitleList = new ArrayList<>();

    public ViewPagerAdapter(FragmentManager manager, Bundle bundle) {
        super(manager);
        Fragment_contacts contact=new Fragment_contacts();
        contact.setArguments(bundle);

        Fragment_info info=new Fragment_info();
        info.setArguments(bundle);

        Fragment_Menu menu=new Fragment_Menu() ;
        menu.setArguments(bundle);

        adapter.addFragment(contact, "تماس با ما");
        adapter.addFragment(info, "درباره ما");
        adapter.addFragment(menu, "منو");
    }

    @Override
    public Fragment getItem(int position) {
        return mFragmentList.get(position);
    }

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

    public void addFragment(Fragment fragment, String title) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return mFragmentTitleList.get(position);
    }
 }

Upvotes: 0

Related Questions