2013-02-06 63 views
-2

我構建了一張幻燈片。 我有一個ViewPage活動,每當我向左或向右移動時調用一個片段。 我的問題是: 我有一個變量int,它在初始狀態的值爲6(week_of_year)。當我向右滑動是調用一個新的片段,並且該變量不是按照我的意圖增加的。該變量僅在第二張幻燈片中增量。
例如:6 - > 6 - > 7 - > 8而不是6 - > 7 - > 8 - >我不明白爲什麼會發生這種情況。滑動後變量值不增加

這裏是我的代碼:
的ViewPage活動

protected void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_screen_slide); 
/** 
* Instantiate a ViewPager and a PagerAdapter 
*/ 
    date = Calendar.getInstance(); 
    mPager = (ViewPager)findViewById(R.id.pager); 
    mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager()); 
    mPager.setAdapter(mPagerAdapter); 

    mPager.setOnPageChangeListener(new OnPageChangeListener() { 
     @Override 
     public void onPageSelected(int arg0) { 
      if(itemOld < arg0){//right 
       auxFront = auxFront + 1; 
       oldStartWeek = oldStartWeek + auxFront; 
       auxFront=0; 
      } 
      else if(itemOld > arg0){//left 
       auxBack = auxBack - 1; 
       oldStartWeek = oldStartWeek + auxBack; 
       auxBack=0; 
      } 

     } 

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

     @Override 
     public void onPageScrollStateChanged(int arg0) { 
     } 
    }); 

} 

@Override 
public void onBackPressed(){ 
    if(mPager.getCurrentItem()==0){ 
     super.onBackPressed(); 
    }else{ 
     mPager.setCurrentItem(mPager.getCurrentItem()-1); 
    } 
} 


/** 
* A simple pager adapter that represents 5 ScreenSlidePageFragment objects, in sequence 
*/ 

private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter{ 
    public ScreenSlidePagerAdapter(FragmentManager fm){ 
     super(fm); 
    } 

    @Override 
    public ScreenSlidePageFragment getItem(int position) { 
     /** 
     * Pass values from ViewPage activity to Fragment 
     */ 
     ScreenSlidePageFragment f = new ScreenSlidePageFragment(); 
     Bundle args = new Bundle(); 
     if(position == 0){ 
      oldStartWeek = date.get(Calendar.WEEK_OF_YEAR); 
      args.putInt("START_WEEK", oldStartWeek); 
      f.setArguments(args); 
      return f; 

     } 
     else if(position != 0){ 
      args.putInt("START_WEEK", oldStartWeek); 
      f.setArguments(args); 
      itemOld = mPager.getCurrentItem(); 
      return f; 
     } 
     return f; 
} 

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

    } 

片段是在每張幻燈片通話------------------- -------------------------

 public class ScreenSlidePageFragment extends Fragment implements 
     AdapterView.OnItemClickListener { 
       public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     Toast.makeText(getActivity(), "week....." +getArguments().getInt("START_WEEK"), Toast.LENGTH_LONG).show(); //show the correct value 

headerWeek.setText(" Week Number: "+getArguments().getInt("START_WEEK",0)); //But is not change corretly in the text view ????? 

感謝您的幫助和時間。

回答

0

要查看ViewPager中發生這種情況的原因,可以爲每個片段記錄onCreate,onPause,onResume等方法。會發生什麼是前兩個片段實際上是在同一時間創建的。因此,第二個片段在實際顯示在ViewPager中之前創建,所以當用戶滾動到第二個片段時,通常會有舊數據。

我對這個問題的解決方法有點不方便。請注意,不是displayDialog(),當用戶在場時,你可以做任何你需要的來更新視圖。

@Override 
public void onResume() { 
    super.onResume(); 
    fragmentActive = true; 
    if (userVisible()){ 
     displayDialog(); 
    } 
    else{ 
     recursiveWait(); 
    } 
} 

private void recursiveWait(){ 
    new WaitAndDoXTask(1000, new DoXListener() { 

     @Override 
     public void doX() { 
      Log.d(TAG, "doX"); 
      if (userVisible()){ 
       displayDialog(); 
      } 
      else if (fragmentActive){ 
       recursiveWait(); 
      } 
     } 
    }).execute(); 
} 

private boolean userVisible(){ 
    boolean vis = getUserVisibleHint(); 
    Log.d(TAG, "user visible = " + vis); 
    return vis; 
} 

@Override 
public void onPause() { 
    super.onPause(); 
    Log.d(TAG, "onPause"); 
    fragmentActive = false; 
} 

這裏是WaitAndDoXTask:

public class WaitAndDoXTask extends AsyncTask<Void, Void, Void>{ 

DoXListener mListener; 
private int mTimeToWait; 

/** This class will wait for the set time then do what is put into the listener. 
* 
* 
* Run like this: 
* new WaitAndDoXTask(1000, new DoXListener() { 
* 
* @Override 
* public void doX() { 
*  // TODO Auto-generated method stub 
*  
* } 
* }).execute(); 
**/ 
public WaitAndDoXTask(int timeToWait, DoXListener listener){ 
    super(); 
    mTimeToWait = timeToWait; 
    mListener = listener; 
} 

public interface DoXListener{ 
    public void doX(); 
} 

@Override 
protected Void doInBackground(Void... params) { 
    try { 
     Thread.sleep(mTimeToWait); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 

@Override 
protected void onPostExecute(Void result) { 
    if (mListener!=null){ 
     mListener.doX(); 
    } 
} 

}

另外,如果你可以設置你的片段與一些適配器和通過onDataSetChanged得到通知,可能更好地工作。