销毁之前的ViewPager项目,阻止向后滚动

时间:2013-01-03 00:10:21

标签: android android-viewpager

我在下面添加了我的代码,包括我尝试过的一些内容。我想要的是一个滑动的viewpager,它不允许你通过以前的项目,但只允许前进。优选地,如果在当前片段内检查某个复选框以允许进行到下一个,则我还希望仅允许向前(从右到左)滚动。

我考虑过

  • 在显示当前片段并且空闲时删除前一个片段
  • 在我重置计数并删除第一个片段以导致“刷新”后再次设置适配器(即:mPager.setAdapter(mPagerAdapter);
  • 在ViewPager上使用onTouchListener并使用motionevent

下面使用mPager.removeViewAt(0)的代码不起作用,因为它不会阻止滚动,只是删除视图,留下空白屏幕。

最好的方法是什么?也许我甚至没有使用正确的适配器,因为我从昨天开始使用碎片。

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.viewpager);
    mPager = (ViewPager) findViewById(R.id.pager);
    mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager());
    mPager.setAdapter(mPagerAdapter);
    mPager.setOnPageChangeListener(mPageListener());
}

public OnPageChangeListener mPageListener() {
    OnPageChangeListener listener = new OnPageChangeListener() {

        public void onPageSelected(int arg0) {}

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

        public void onPageScrollStateChanged(int arg0) {
            if (arg0 == ViewPager.SCROLL_STATE_IDLE && mPager.getCurrentItem() != 0) {
                mPager.removeViewAt(0);
                mPagerAdapter.notifyDataSetChanged();
                //mPagerAdapter.destroyItem(mPager, arg0, mPagerAdapter.getItem(arg0));
            }
        }
    };
    return listener;
}

private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {

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

    @Override
    public Fragment getItem(int position) {
        Bundle args = new Bundle();
        args.putInt("position", position);
        Fragment fragment = new PracticeModeFragment();
        fragment.setArguments(args);
        return fragment;
    }

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

public class PracticeModeFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.row,
                container, false);
        ((TextView) rootView.findViewById(R.id.count)).setText(""
                + getArguments().getInt("position"));
        return rootView;

    }

}

1 个答案:

答案 0 :(得分:2)

我认为您使用的是错误的工具。 ViewPager不应该以这种方式使用。

只需使用FragmentManagerFragmentTransactions替换片段即可。通过这样做,您可以完全控制后台堆栈和事务。

您还可以手动向片段添加手势以模拟ViewPager效果。 Here's a tutorial for that.