【问题标题】:Variable value is not increment after sliding滑动后变量值不递增
【发布时间】:2013-02-06 17:51:58
【问题描述】:

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

感谢您的帮助和时间。

【问题讨论】:

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


    【解决方案1】:

    要查看 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();
        }
    }
    

    }

    或者,如果您可以使用一些 Adapter 设置您的 Fragment 并通过 onDataSetChanged 获得通知,这可能会更好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-04
      • 1970-01-01
      相关资源
      最近更新 更多