ViewPager fragmentstatepageadapter getItem未传递正确的位置

时间:2013-01-02 04:52:54

标签: android android-viewpager

我创建了一个viewpager布局,一个扩展FragmentActivity和一个片段的类。我想要的是每个片段都被传递到viewpager中的位置。因此,第一个viewpager被创建为获取参数0,第二个获得1等等。然后,如果我以某种方式滚动这些数字仍然是真正的计数。

问题是第一次创建一个片段,它似乎被创建了两次,所以传递的位置是0然后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两次,然后再转到我的fragment类,这样位置为0然后1.当它到达我的fragment类时,它使布局很好,我滚动了几个(3或4)新页面,每次添加一个位置然后当我向后滚动它说它是零或两个然后数字继续像零星一样。最后,当我滚动回到开头时,位置再次为0,所以突然显示我的位置0的片段。

我不明白发生了什么,所以我想知道这是什么错误?

公共类PracticeFragment扩展了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 - 仍然是同样的问题。

2 个答案:

答案 0 :(得分:1)

每次将getAll初始化为getItem()

中的新对象

使你的片段类静态

并在PracticeFragment

中创建一个方法
 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);
       }

答案 1 :(得分:0)

对它进行子类化修复了问题!