【问题标题】:android- viewpager setCurrentItem make first fragment not loadedandroid-viewpager setCurrentItem 使第一个片段未加载
【发布时间】:2017-05-07 16:32:27
【问题描述】:

我在我的应用程序中使用 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 时,它会完美加载。

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

【问题讨论】:

    标签: android android-fragments android-viewpager


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      不要在活动中保留对片段的引用,而是尝试在 ViewPager 中做同样的事情

      当您将项目添加到列表中时,视图分页器可能已经初始化,并且两者之间存在某种“同步”问题。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多