2013-01-02 17 views
2

我已经创建了一个viewpager布局,一个扩展FragmentActivity的类和一个片段。我想要的是每个片段都被传递到viewpager中的什么位置。所以第一个viewpager被创建得到参数0,第二个获得1等等。然后,如果我滚动这种或那种方式,这些数字仍然是一个真正的计数。ViewPager fragmentstatepageadapter getItem没有通过正确的位置

问题是第一次创建一个片段,它似乎被创建两次,所以传递的位置是0然后1.但是我不能回滚,但我知道肯定该类被调用两次。现在当我向前滚动时,位置递增1。但是,如果我回滚动立即下降到三只一页回来,然后继续下跌近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两次,甚至去我的片段类,以便位置为0然后1。然后,当它到达我的片段类它使布局正常,我滚动几个(3或4)新页面并且每当我向后滚动表示它是零个或两个时,它就会向该位置添加一个,然后这些数字仍然是零星的。最后,当我滚动回到开始位置时,突然再次显示0,所以我的位置0的片段突然显示。

我不明白发生了什么,所以我想知道错误是什么?还是同样的问题 -

公共类PracticeFragment如果我注释掉的一切,但一个ViewGroup,返回rootview延伸片段{

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; 
} 

} 

不过。

+0

添加您的片段代码也 –

+0

@bhaveshN添加:)还你帮我 – AndroidPenguin

+0

增加了更多的信息 – AndroidPenguin

回答

0

子类化它解决了问题!

+0

I'米有这个相同的问题你是什么意思的“继承它” – Petro

+0

@AndroidPenguin你可以具体说明什么代码更改确切地解决了问题。 –

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); 
     } 
+0

这将返回相同的错误真的很感激:/ 捆绑ARGS =新包(); args.putInt(“position”,postition) Fragment fragment = new PracticeFragment(); fragment.setArguments(args); return fragment; – AndroidPenguin

+0

在片段 –

+0

中的oncreate方法中获取参数请参阅此链接http://developer.android.com/reference/android/support/v4/app/FragmentStatePagerAdapter.html –

相关问题