【问题标题】:FragmentPagerAdapter getItem wrong positionFragmentPagerAdapter getItem 位置错误
【发布时间】:2013-06-30 14:36:50
【问题描述】:

我在 FramentPageAdapter 遇到了奇怪的问题

MainActivity.java

@SuppressLint("ValidFragment")
public class MainActivity<DashboardActivity> extends FragmentActivity implements     ActionBar.TabListener {
...
...
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    final ActionBar actionBar = getActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    mTabHost = (FragmentTabHost)findViewById(android.R.id.tabhost);
    mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
    mViewPager = (ViewPager) findViewById(R.id.pager);
    mViewPager.setAdapter(mSectionsPagerAdapter);
    mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
        @Override
        public void onPageSelected(int position) {
            actionBar.setSelectedNavigationItem(position);
        }
    });

    actionBar.addTab(actionBar.newTab().setText(mSectionsPagerAdapter.getPageTitle(0)).setTabListener(this).setIcon(R.drawable.rating_good));
    actionBar.addTab(actionBar.newTab().setText(mSectionsPagerAdapter.getPageTitle(1)).setTabListener(this).setIcon(R.drawable.action_search));
    actionBar.addTab(actionBar.newTab().setText(mSectionsPagerAdapter.getPageTitle(2)).setTabListener(this).setIcon(R.drawable.action_search));
}
...
public class SectionsPagerAdapter extends FragmentPagerAdapter {
    public SectionsPagerAdapter(FragmentManager fm) {
        super(fm);
    }
    public Fragment getItem(int position) {
        Fragment fragment = null; 
        switch(position) {
            case 0:
                fragment = new Fragment0();  
            break;
            case 1:
                fragment = new Fragment1();  
            break;
            case 2:
                fragment = new Fragment2();  
            break;
        }
        return fragment;
    }
    @Override
    public int getCount() {
        return 3;
    }
    /*
     * Title
     */
    @Override
    public CharSequence getPageTitle(int position) {
        Locale l = Locale.getDefault();
        switch (position) {
        case 0:
            return getString(R.string.title_section0).toUpperCase(l);
        case 1:
            return getString(R.string.title_section1).toUpperCase(l);
        case 2:
            return getString(R.string.title_section2).toUpperCase(l);
        }
        return null;
    }
}

当我尝试在 3 个选项卡之间切换时,public Fragment getItem(int position) 返回错误的位置。当我创建只有 2 个选项卡的应用程序时,一切正常。添加超过 2 个,产生奇怪的问题。 从 0 位置切换到 1 位置 - 工作正常,从 1 切换到 0 - 工作正常,从 1 位置切换到 2 位置 - 工作正常,但是,当我尝试从 2 位置返回到 1 位置时,公共片段 getItem(int position) - int 位置返回“0”而不是“1”。 有人帮我解决这个问题吗?

【问题讨论】:

  • 这似乎是一个关键问题,有人对此有“正确的解决方案”吗?

标签: android fragmentpageradapter


【解决方案1】:

好的,我找到了解决方案。 首先,getItem“int position”,并不表示当前显示片段。 要显示 3 个或更多选项卡,而不卸载第一个片段,您必须添加此行:

mViewPager.setOffscreenPageLimit(3);

故事结束...

【讨论】:

  • 这是一个非常糟糕的建议.. 你不能在不使用的时候让你的片段保持活动状态,所以你的 android 会调用来完成它。并通过添加这一行 mViewPager.setOffscreenPageLimit(count);您要求android不要清除这些未使用的片段,想想当您的片段有大量图像时会发生什么......
  • @user2536592 你解决了我面临同样问题的问题吗 public Fragment getItem(int i) 两次调用给出了错误的位置我有 5 个标签和 5 个片段 if(i>0){ i = i-1;工作,但问题是最后一个选项卡或片段没有调用 b/c position = position -1 mViewPager.setOffscreenPageLimit(4);不适合我
【解决方案2】:

你只需要:

mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

    }

    @Override
    public void onPageSelected(int position) {
        Log.d("test", "position = " + position);
    }

    @Override
    public void onPageScrollStateChanged(int state) {

    }
});

onPageSelected 中的 position 是您想要的。

【讨论】:

    【解决方案3】:

    我遇到了同样的问题,我在每个选项卡中都使用了片段; 所以不是

    mViewPager.setAdapter(new MainTabs(getFragmentManager()));
    

    使用这个:

    mViewPager.setAdapter(new MainTabs(getChildFragmentManager()));
    

    【讨论】:

    • 无论如何使用 minSDK 14 使用 getChildFragmentManager()?
    • 无法获得 getChildFragmentManager 支持(除非您处于领先地位,否则这是必需的..)
    【解决方案4】:

    如果其他人有这个问题,我通过不使用给定的position 来解决它。相反,我得到FragmentListgetSupportFragmentManager,循环并检查当前的Fragment 是否是instanceof 我想要的Fragment

    【讨论】:

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