滑动后变量值不增加

时间:2013-02-06 17:51:58

标签: android android-activity android-viewpager fragment slide

我制作了一张幻灯片。 我有一个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  ?????

感谢您的帮助和时间。

1 个答案:

答案 0 :(得分: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();
    }
}

}

或者,如果您可以使用某些适配器设置Fragment并通过onDataSetChanged获得通知,这可能会更好。