2

ビューページ レイアウト、FragmentActivity を拡張するクラス、およびフラグメントを作成しました。私が望むのは、各フラグメントがビューページ内のどの位置に渡されるかということです。したがって、最初のビューページャーは引数 0 を取得して作成され、2 番目は 1 などを取得します。その後、何らかの方法でスクロールすると、これらの数値は真のカウントのままになります。

問題は、フラグメントが初めて作成されたときです。2 回作成されたように見えるため、渡された位置は 0 から 1 です。前方にスクロールすると、位置が 1 ずつ増加します。ただし、スクロールして戻ると、1 ページだけ戻ってすぐに 3 に下がり、1 を超えて 0 に下がり続けるので、最終的に 0 のレイアウトを見ることができます。

私はこれを持っています:

private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {

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

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

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

まず、フラグメント クラスに移動する前に getItem を 2 回実行して、位置が 0 から 1 になるようにします。その後、フラグメント クラスに到達すると、レイアウトがうまくなり、いくつか (3 または 4) ページをスクロールして新しいページをスクロールし、毎回位置に1を追加し、スクロールバックすると0または2であると表示され、数値は散発的であり続けます。最後に突然、スクロールして最初に戻ると、位置が再び0になるため、位置0のフラグメントが突然表示されます。

何が起こっているのかわからないので、何が間違っているのだろうか?

public class PracticeFragment extends Fragment {

TextView question, explain;
private ScrollView sv;
private boolean starActionBar;
private final static int version = Consts.SDKversion;

ArrayList<RadioButton> rbArray;
ArrayList<LinearLayout> lArray;
ArrayList<ImageView> ivArray;


int iRow;

SQLite info;
private String correctAnswer;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    info = new SQLite(getActivity());
    starActionBar = PreferenceManager.getDefaultSharedPreferences(
            getActivity()).getBoolean("star", true);
    setHasOptionsMenu(true);

}

@Override
public void onViewStateRestored(Bundle savedInstanceState) {
    super.onViewStateRestored(savedInstanceState);
    for (RadioButton r : rbArray) {
        if (r.isChecked()) {
            r.performClick();
        }
    }
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.activity_pm_fragment, menu);
    super.onCreateOptionsMenu(menu, inflater);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    ViewGroup rootView = (ViewGroup) inflater.inflate(
            R.layout.activity_main, container, false);

    lArray = new ArrayList<LinearLayout>();
    rbArray = new ArrayList<RadioButton>();
    ivArray = new ArrayList<ImageView>();

    lArray.add((LinearLayout) rootView.findViewById(R.id.PM_LinLay0));
    lArray.add((LinearLayout) rootView.findViewById(R.id.PM_LinLay1));
    lArray.add((LinearLayout) rootView.findViewById(R.id.PM_LinLay2));
    lArray.add((LinearLayout) rootView.findViewById(R.id.PM_LinLay3));
    lArray.add((LinearLayout) rootView.findViewById(R.id.PM_LinLay4));

    for (LinearLayout l : lArray) {
        l.setOnTouchListener(PracticeFragment.this);
        l.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                if (((ViewGroup) v).getChildAt(0).isEnabled()) {
                    ((ViewGroup) v).getChildAt(0).performClick();
                }
            }
        });
    }

    rbArray.add((RadioButton) rootView.findViewById(R.id.radio0));
    rbArray.add((RadioButton) rootView.findViewById(R.id.radio1));
    rbArray.add((RadioButton) rootView.findViewById(R.id.radio2));
    rbArray.add((RadioButton) rootView.findViewById(R.id.radio3));
    rbArray.add((RadioButton) rootView.findViewById(R.id.radio4));

    ivArray.add((ImageView) rootView.findViewById(R.id.ivradio0));
    ivArray.add((ImageView) rootView.findViewById(R.id.ivradio1));
    ivArray.add((ImageView) rootView.findViewById(R.id.ivradio2));
    ivArray.add((ImageView) rootView.findViewById(R.id.ivradio3));
    ivArray.add((ImageView) rootView.findViewById(R.id.ivradio4));


    rootView.findViewById(R.id.bNext).setVisibility(View.GONE);
    rootView.findViewById(R.id.bPrevious).setVisibility(View.GONE);
    sv = (ScrollView) rootView.findViewById(R.id.svMain);

    info.open();
    iRow = Integer.valueOf(info.getEverything(getArguments(), getArguments().getInt("position"), "next"));
    Cursor c = info.getCursor(iRow);
    ((TextView) rootView.findViewById(R.id.tvQuestion))
            .setText((getArguments().getInt("position") + 1) + ") " + c.getString(2));

    explain = (TextView) rootView.findViewById(R.id.tvExplain);
    explain.setText(c.getString(9));
    explain.setVisibility(View.GONE);
    correctAnswer = c.getString(8);


    String[] aArray = { c.getString(3), c.getString(4), c.getString(5),
            c.getString(6), c.getString(7) };

    c.close();
    info.close();

    int o = 0;
    int pos = 0;
    for (String s : aArray) {
        LinearLayout l = lArray.get(pos);
        if (s.contentEquals("BLANK")) {
            l.setVisibility(View.GONE);
        } else {
            l.setVisibility(View.VISIBLE);
            rbArray.get(pos).setText(s);
            rbArray.get(pos).setOnClickListener(null);
            if (o % 2 == 0) {
                l.setBackgroundColor(Consts.colorAlt);
            }
            o++;
        }
        pos++;
    }

    return rootView;
}

}

ただし、ビューグループ以外のすべてをコメントアウトして rootview を返すと、同じ問題が発生します。

4

2 に答える 2

1

getItem()で毎回getAllを新しいオブジェクトとして初期化します

フラグメントクラスを静的にする

そしてPracticeFragmentで1つのメソッドを作成します

 static PracticeFragment newInstance(int num) {
        PracticeFragment f = new PracticeFragment();

        // Supply num input as an argument.
        Bundle args = new Bundle();
        args.putInt("num", num);
        f.setArguments(args);

        return f;
    }

とアダプターの変更

     @Override
public Fragment getItem(int position) {
        return PracticeFragment.newInstance(position);
       }
于 2013-01-02T05:51:53.957 に答える
0

サブクラス化すると問題が解決しました!

于 2013-01-02T23:53:41.857 に答える