6

我有一个由 Jake Wharton 编写的 viewpagerindicator,在那个 viewpager 中我有 6 页。所有页面都包含列表视图,我正在使用 AsyncTask 加载它们。有时 viewpager 在错误的索引处显示错误的页面。这是我的 viewpager 适配器:

public class TestFragmentAdapter extends FragmentPagerAdapter{
    protected static final String[] CONTENT = new String[] { "a","b","c","d","e","f" };

    private int mCount = CONTENT.length;
    Fragment fragment1,fragment2,fragment3,fragment4,fragment5,fragment6;

    public TestFragmentAdapter(FragmentManager fm) {
        super(fm);
        fragment1 = new CategoryListView();
        fragment2 = CustomizedListviewRecent.newInstance(41);
        fragment3 = CustomizedListviewMostRecents.newInstance(0);
        fragment4 = CustomizedListviewPopulars.newInstance();
        fragment5 = CustomizedListviewRecent.newInstance(42);
        fragment6 = CustomizedListviewRecent.newInstance(43);

    }

    @Override
    public Fragment getItem(int position) {
        if(position == 0)
            return fragment1;
        else if(position == 1)
            return fragment2;
        else if(position == 2)
            return fragment3;
        else if(position == 3)
            return fragment4;
        else if(position == 4)
            return fragment5;
        else
            return fragment6;
    }
    @Override
    public int getCount() {
        return mCount;
    }

    @Override
    public CharSequence getPageTitle(int position) {
      return TestFragmentAdapter.CONTENT[position % CONTENT.length];
    }

    public void setCount(int count) {
        if (count > 0 && count <= 10) {
            mCount = count;
            notifyDataSetChanged();
        }
    }

}

这是我创建viewpager的方式:

public class SampleTitlesDefault extends BaseSampleActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mAdapter = new TestFragmentAdapter(getSupportFragmentManager());

        mPager = (ViewPager)findViewById(R.id.pager);
        mPager.setAdapter(mAdapter);

        mIndicator = (TitlePageIndicator)findViewById(R.id.indicator);
        mIndicator.setViewPager(mPager);
        mIndicator.setCurrentItem(1);
    }

}

这里有什么问题?我该如何解决?感谢您的帮助

4

2 回答 2

2

我知道为时已晚,但可能有人需要它。

我也遇到过关于错误位置的类似问题,有时由于位置错误,它在两个片段上显示相同的结果。我通过替换解决了我的FragmentPagerAdapter问题FragmentStatePagerAdapter

而且我还从使用接口的onPageScrolled方法中传递了索引位置OnPageChangeListener

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


        }

        @Override
        public void onPageSelected(int position) {

            bundle = new Bundle();
            bundle.putInt("position", position);
            primaryFragment.setCurrentPostionAndData(position);

        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });

就像文档说的那样,这样想。如果你要做一个像阅读器这样的应用程序,你不会希望一次将所有片段加载到内存中。您想在用户阅读时加载和销毁片段。在这种情况下,您将使用 FragmentStatePagerAdapter。如果您只是显示 3 个不包含大量数据(如位图)的“选项卡”,那么 FragmentPagerAdapter 可能很适合您。另外,请记住,默认情况下 ViewPager 会将 3 个片段加载到内存中。您提到的第一个适配器可能会破坏视图层次结构并在需要时重新加载它,第二个适配器仅保存片段的状态并完全销毁它,如果用户随后返回该页面,则检索状态。

FragmentPagerAdapter 和 FragmentStatePagerAdapter 的区别

于 2016-05-12T08:05:11.680 回答
0

请不要自己“缓存” Fragments,因为它已经为您做到了。

也就是说,您应该newInstancegetItem方法中使用它们,而不是在创建适配器时。例子:

public TestFragmentAdapter(FragmentManager fm) {
    super(fm);
}

@Override
public Fragment getItem(int position) {
    if(position == 0)
        return new CategoryListView();
    else if(position == 1)
        return CustomizedListviewRecent.newInstance(41);
    else if(position == 2)
        return CustomizedListviewMostRecents.newInstance(0);
    else if(position == 3)
        return CustomizedListviewPopulars.newInstance();
    else if(position == 4)
        return CustomizedListviewRecent.newInstance(42);
    else
        return CustomizedListviewRecent.newInstance(43);
}

这样做的常见原因是:

  1. 人们认为这样做更有效率;或者
  2. Fragment稍后可能需要对的引用。

对于(1),正如我所说,您不必担心它(除非您想学习它并稍后进行调整,但现在就让它吧)。如果你需要(2),那么你可以这样做最初在这里看到)。

于 2013-01-28T01:31:42.733 回答