3

私が試したいくつかのことを含めて、以下にコードを追加しました。私が欲しいのは、前のアイテムを通過することはできず、進むことだけができるスライディング ビューページャーです。できれば、現在のフラグメント内で特定のチェックボックスがオンになっていて、次のフラグメントに進むことができる場合にのみ、前方 (右から左) へのスクロールも許可したいと考えています。

検討しました

  • 現在のフラグメントが表示されてアイドル状態になったら、前のフラグメントを削除する
  • カウントをリセットし、最初のフラグメントを削除して「リフレッシュ」を発生させたら、アダプタ(つまり、これ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;

    }

}
4

1 に答える 1

2

間違ったツールを使用していると思います。ViewPager は、そのように使用するためのものではありません。

FragmentManagerFragmentTransactionsを使用してフラグメントを置き換えるだけです。そうすることで、バックスタックとトランザクションを完全に制御できます。

ジェスチャーをフラグメントに手動で追加して、ViewPager 効果をシミュレートすることもできます。これがそのためのチュートリアルです。

于 2013-01-03T00:20:56.427 に答える