android-viewpager setCurrentItem使第一个片段未加载

时间:2016-12-22 05:50:13

标签: android android-fragments android-viewpager

我在我的应用程序中使用了viewpager和FragmentPagerAdapter。在第一个活动中,这是我的代码:

      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);
    }
}

我使用setCurrentItem,因为我的应用程序不是英文版,默认选中的选项卡应该在右边。

当我使用setCurrentItem时,Fragment_contacts未加载且未显示任何内容,但当我删除setCurrentItem时,它会完全加载。

有什么问题?我该怎么解决这个问题?

2 个答案:

答案 0 :(得分:0)

不要在您的活动中保留对您的片段的引用,请尝试在ViewPager

中执行相同操作

当您在列表中添加项目时,可能已经初始化了视图寻呼机,并且存在一种&#34;同步&#34;两者之间的问题。

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);
    }
 }

答案 1 :(得分:0)

您的ViewPager在初始化之前需要一些时间才能使用setCurrentItem。因此,在ViewPager初始化之后通过在线程中调用它来设置它,如下所示:

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