-2

我已经建立了一个幻灯片。我有一个 ViewPage 活动,每次我向左或向右滑动时都会调用一个片段。我的问题是:我有一个变量 int,它在初始状态下的值为 6(week_of_year)。当我向右滑动时调用一个新片段并且变量不是我想要的增量。该变量仅在第二张幻灯片中增加。
例如: 6 -> 6 -> 7 -> 8 而不是 6 -> 7 -> 8 -> 而且我不知道为什么会发生这种情况。

这是我的代码:
ViewPage Activity

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  ?????

感谢您的帮助和时间。

4

1 回答 1

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 获得通知,这可能会更好。

于 2013-02-06T18:27:58.670 回答