-2

スライドを作成しました。左または右にスワイプするたびにフラグメントを呼び出すViewPageアクティビティがあります。私の質問は次のとおりです。初期状態では値6(week_of_year)を持つ変数intがあります。右にスライドすると、新しいフラグメントが呼び出され、変数が意図したとおりにインクリメントされません。変数は、2番目のスライドでのみ増分されます。
例:6->7->8->の代わりに6->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  ?????

あなたの助けと時間をありがとう。

4

1 に答える 1

0

ViewPager でこれが発生する理由を確認するには、各フラグメントの onCreate、onPause、onResume などのメソッドをログに記録します。実際には、最初の 2 つのフラグメントがほぼ同時に作成されます。そのため、ViewPager に実際に表示される前に 2 番目のフラグメントが作成されるため、ユーザーが 2 番目のフラグメントにスクロールするまでに、そこには古いデータが存在することがよくあります。

これに対する私の解決策は少しハックです。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 をいくつかの Adapter でセットアップし、 onDataSetChanged を介して通知を受け取ることができれば、よりうまく機能する可能性があります。

于 2013-02-06T18:27:58.670 に答える