Android无限FragmentPagerAdapter在刷卡时使用新的适配器

时间:2014-08-27 14:15:12

标签: android android-fragments android-pageradapter

我正在尝试创建一个无尽的FragmentPagerAdapter,在滑动时用新的替换适配器,并根据您刷的哪一侧,增加或减少全局变量,这样您就可以知道什么位置你是。所以我试过这个

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
    mViewPager = (ViewPager) findViewById(R.id.pager);
    mViewPager.setOffscreenPageLimit(0);
    mViewPager.setAdapter(mSectionsPagerAdapter);
    mViewPager.setCurrentItem(1);
    mViewPager.setOnPageChangeListener(new OnPageChangeListener() {

        @Override
        public void onPageSelected(int arg0) {
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
            if (mViewPager.getCurrentItem() == 0) {
                // left
                mViewPager.setAdapter(null);
                mViewPager.setAdapter(new SectionsPagerAdapter(getSupportFragmentManager()));
                mViewPager.setCurrentItem(1);
                MyVar.INST.position--;
            } else if (mViewPager.getCurrentItem() == 2) {
                // right
                mViewPager.setAdapter(null);
                mViewPager.setAdapter(new SectionsPagerAdapter(getSupportFragmentManager()));
                mViewPager.setCurrentItem(1);
                MyVar.INST.position++;
            }
        }

        @Override
        public void onPageScrollStateChanged(int arg0) {
        }
    });
}

问题是,即使我已经将offscreenPageLimit设置为0,默认情况下Android仍会将3片段缓存在内存中,所以当我向右滚动时,OnPageChangeListener中的方法没有被调用,因此全局变量没有正确递增.... 我知道如何解决这个问题?

编辑:这是适配器

private class SectionsPagerAdapter extends FragmentPagerAdapter {

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

    @Override
    public Fragment getItem(int position) {
        return Fragment1.newInstance(MyVar.INST.position + position);
    }

    @Override
    public int getCount() {
        return 3;
    }

}

1 个答案:

答案 0 :(得分:1)

所以我设法做到这一点,效果很好

private void setAdapter() {
    mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
    mViewPager.setAdapter(mSectionsPagerAdapter);
    mViewPager.setCurrentItem(1);
    mViewPager.setOnPageChangeListener(new OnPageChangeListener() {

        @Override
        public void onPageSelected(int arg0) {
            if (mViewPager.getCurrentItem() == 0) {
                // left
                mViewPager.removeAllViews();
                //globalVariable--;
                setAdapter();
            } else if (mViewPager.getCurrentItem() == 2) {
                // right
                mViewPager.removeAllViews();
                //globalVariable++;
                setAdapter();
            }
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
        }

        @Override
        public void onPageScrollStateChanged(int arg0) {
        }
    });
}

适配器保持不变

private class SectionsPagerAdapter extends FragmentPagerAdapter {

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

@Override
public Fragment getItem(int position) {
    return Fragment1.newInstance(MyVar.INST.position + position);
}

@Override
public int getCount() {
    return 3;
}

使它工作的主要因素是mViewPager.removeAllViews();,它删除了以前的碎片,所以它不会搞砸。 使用在其他类(例如,单例)中定义的globalVariable来了解您从哪个位置开始