2014-02-13 63 views
2

我有一個ViewPager,它表示星期和它的無限。Android viewpager加載錯誤的數據

問題是,當我向左或向右滑動正確的數據加載,並在第二秒後從其開始的那一週重新加載數據。

PageModelWeek.java

public class PageModelWeek 
{ 
    private int index; 

    private String text;  

    private String monday; 
    private String mondayValue; 
    private String tuesday; 
    private String tuesdayValue; 
    private String wednesday; 
    private String wednesdayValue; 
    private String thursday; 
    private String thursdayValue; 
    private String friday; 
    private String fridayValue; 
    private String saturday; 
    private String saturdayValue; 
    private String sunday; 
    private String sundayValue; 

    private Context context; 

    public PageModelWeek(int index, Context context) 
    { 
     this.index = index; 
     this.context = context; 
     setIndex(index); 
    } 

    public int getIndex() 
    { 
     return index; 
    } 

    public void setIndex(int index) 
    { 
     this.index = index; 
     setWeek(index); 
    } 

    public String getText() 
    { 
     return text; 
    } 

    public void setText(String text) 
    { 
     this.text = text; 
    } 

    public Context getContext() 
    { 
     return context; 
    } 

    public void setContext(Context context) 
    { 
     this.context = context; 
    } 

    private void setWeek(int index) 
    { 
     SimpleDateFormat dayOfWeekFormat = new SimpleDateFormat("EEEE", Locale.getDefault()); 
     SimpleDateFormat dayOfMonthFormat = new SimpleDateFormat("dd", Locale.getDefault()); 

     Calendar calendar = Calendar.getInstance(); 

     calendar.add(Calendar.WEEK_OF_YEAR, index); 
     calendar.setFirstDayOfWeek(Calendar.MONDAY); 
     calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); 
     calendar.set(Calendar.HOUR_OF_DAY, 0); 

     for (int i = 0; i < 7; i++) 
     {   
      if (i == 0) 
      { 
       monday = dayOfWeekFormat.format(calendar.getTime()).substring(0, 1).toUpperCase(); 
       mondayValue = dayOfMonthFormat.format(calendar.getTime()); 
      } 
      else if (i == 1) 
      { 
       tuesday = dayOfWeekFormat.format(calendar.getTime()).substring(0, 1).toUpperCase(); 
       tuesdayValue = dayOfMonthFormat.format(calendar.getTime()); 
      } 
      else if (i == 2) 
      { 
       wednesday = dayOfWeekFormat.format(calendar.getTime()).substring(0, 1).toUpperCase(); 
       wednesdayValue = dayOfMonthFormat.format(calendar.getTime()); 
      } 
      else if (i == 3) 
      { 
       thursday = dayOfWeekFormat.format(calendar.getTime()).substring(0, 1).toUpperCase(); 
       thursdayValue = dayOfMonthFormat.format(calendar.getTime()); 
      } 
      else if (i == 4) 
      { 
       friday = dayOfWeekFormat.format(calendar.getTime()).substring(0, 1).toUpperCase(); 
       fridayValue = dayOfMonthFormat.format(calendar.getTime()); 
      } 
      else if (i == 5) 
      { 
       saturday = dayOfWeekFormat.format(calendar.getTime()).substring(0, 1).toUpperCase(); 
       saturdayValue = dayOfMonthFormat.format(calendar.getTime()); 
      } 
      else if (i == 6) 
      { 
       sunday = dayOfWeekFormat.format(calendar.getTime()).substring(0, 1).toUpperCase(); 
       sundayValue = dayOfMonthFormat.format(calendar.getTime()); 
      } 

      calendar.add(Calendar.DATE, 1); 
     }  

     SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); 
     String d = sdf.format(calendar.getTime());    

     this.text = d;  
    } 

    public String getMonday() 
    { 
     return monday; 
    } 

    public String getMondayValue() 
    { 
     return mondayValue; 
    } 

    public String getTuesday() 
    { 
     return tuesday; 
    } 

    public String getTuesdayValue() 
    { 
     return tuesdayValue; 
    } 

    public String getWednesday() 
    { 
     return wednesday; 
    } 

    public String getWednesdayValue() 
    { 
     return wednesdayValue; 
    } 

    public String getThursday() 
    { 
     return thursday; 
    } 

    public String getThursdayValue() 
    { 
     return thursdayValue; 
    } 

    public String getFriday() 
    { 
     return friday; 
    } 

    public String getFridayValue() 
    { 
     return fridayValue; 
    } 

    public String getSaturday() 
    { 
     return saturday; 
    } 

    public String getSaturdayValue() 
    { 
     return saturdayValue; 
    } 

    public String getSunday() 
    { 
     return sunday; 
    } 

    public String getSundayValue() 
    { 
     return sundayValue; 
    }  
} 

偵聽

viewPagerWeeks.setOnPageChangeListener(new OnPageChangeListener() 
     { 

      @Override 
      public void onPageSelected(int position) 
      { 
       mSelectedWeekPageIndex = position; 

      } 

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

      @Override 
      public void onPageScrollStateChanged(int state) 
      { 
       if (state == ViewPager.SCROLL_STATE_IDLE) 
       { 

        final PageModelWeek leftPage = mWeekPageModel[PAGE_LEFT]; 
        final PageModelWeek middlePage = mWeekPageModel[PAGE_MIDDLE]; 
        final PageModelWeek rightPage = mWeekPageModel[PAGE_RIGHT]; 

        final int oldLeftIndex = leftPage.getIndex(); 
        final int oldMiddleIndex = middlePage.getIndex(); 
        final int oldRightIndex = rightPage.getIndex(); 

        // user swiped to right direction --> left page 
        if (mSelectedWeekPageIndex == PAGE_LEFT) 
        { 

         // moving each page content one page to the right 
         leftPage.setIndex(oldLeftIndex - 1); 
         middlePage.setIndex(oldLeftIndex); 
         rightPage.setIndex(oldMiddleIndex); 

         setWeekContent(PAGE_RIGHT); 
         setWeekContent(PAGE_MIDDLE); 
         setWeekContent(PAGE_LEFT); 

         // user swiped to left direction --> right page 
        } 
        else if (mSelectedWeekPageIndex == PAGE_RIGHT) 
        { 

         leftPage.setIndex(oldMiddleIndex); 
         middlePage.setIndex(oldRightIndex); 
         rightPage.setIndex(oldRightIndex + 1); 

         setWeekContent(PAGE_LEFT); 
         setWeekContent(PAGE_MIDDLE); 
         setWeekContent(PAGE_RIGHT); 
        } 

        viewPagerWeeks.setCurrentItem(PAGE_MIDDLE, false); 
       } 
      } 
     }); 

setContentWeek

private void setWeekContent(int index) 
    { 
     final PageModelWeek model = mWeekPageModel[index];     
    } 

適配器

private class ViewPagerWeeksAdaper extends PagerAdapter 
    { 

     @Override 
     public int getItemPosition(Object object) 
     { 
      return POSITION_NONE; 
     } 

     @Override 
     public void destroyItem(ViewGroup container, int position, Object object) 
     { 
      container.removeView((View) object); 
     } 

     @Override 
     public int getCount() 
     { 
      // we only need three pages 
      return 3; 
     } 

     @Override 
     public Object instantiateItem(ViewGroup container, int position) 
     { 
      LinearLayout ll = (LinearLayout) mInflater.inflate(R.layout.dayview_header_days, null);   
      PageModelWeek currentWeek = mWeekPageModel[position];  

      for (int i = 0; i < ll.getChildCount(); i++) 
      { 
       LinearLayout llDay = (LinearLayout) ll.getChildAt(i); 
       TextView tvDayOfWeek = (TextView) llDay.getChildAt(0); 
       TextView tvDayOfMonth = (TextView) llDay.getChildAt(1); 

       if (i == 0) 
       { 
        tvDayOfWeek.setText(currentWeek.getMonday()); 
        tvDayOfMonth.setText(currentWeek.getMondayValue()); 
       } 
       else if (i == 1) 
       { 
        tvDayOfWeek.setText(currentWeek.getTuesday()); 
        tvDayOfMonth.setText(currentWeek.getTuesdayValue()); 
       } 
       else if (i == 2) 
       { 
        tvDayOfWeek.setText(currentWeek.getWednesday()); 
        tvDayOfMonth.setText(currentWeek.getWednesdayValue()); 
       } 
       else if (i == 3) 
       { 
        tvDayOfWeek.setText(currentWeek.getThursday()); 
        tvDayOfMonth.setText(currentWeek.getThursdayValue()); 
       } 
       else if (i == 4) 
       { 
        tvDayOfWeek.setText(currentWeek.getFriday()); 
        tvDayOfMonth.setText(currentWeek.getFridayValue()); 
       } 
       else if (i == 5) 
       { 
        tvDayOfWeek.setText(currentWeek.getSaturday()); 
        tvDayOfMonth.setText(currentWeek.getSaturdayValue()); 
       } 
       else if (i == 6) 
       { 
        tvDayOfWeek.setText(currentWeek.getSunday()); 
        tvDayOfMonth.setText(currentWeek.getSundayValue()); 
       }    
      } 

      container.addView(ll); 
      return ll; 
     } 

     @Override 
     public boolean isViewFromObject(View view, Object obj) 
     { 
      return view == obj; 
     } 
    } 

當我開始活動

private void initWeekPageModel() 
    { 
     for (int i = 0; i < mWeekPageModel.length; i++) 
     { 
      // init the pagemodel with indexes of -1, 0 and 1 
      mWeekPageModel[i] = new PageModelWeek(i - 1, this); 
     } 
    } 

回答

0

我覺得這行什麼讓你煩惱的onPageScrollStateChanged(int state)位於這就是所謂的:

viewPagerWeeks.setCurrentItem(PAGE_MIDDLE, false); 

當我閱讀代碼。只要viewpager「安定下來」,然後在最後滾動到初始頁面(這是我假設的中間頁面),它會執行一些操作。

+0

感謝您的回覆。但是,該行確保ViewPager是無限的。 我在頁面上移動數據,它只循環3頁。 如果我沒有這條線,副總裁只會左右滑動。 – AndroidCoder

+0

當你基於頁面位置生成視圖時,我建議你使用http://stackoverflow.com/questions/7766630/changing-viewpager-to-enable-infinite-page-scrolling中petrnohejl的方法代替無限滾動。該解決方案還將代碼隔離在pageadapter中。這雖然需要你(我認爲)使用FragmentStatePagerAdapter,因此切換到片段進行視圖處理而不是當前的instantiateItem。我知道這似乎很多工作,但它很可能是值得的。 – cYrixmorten

+0

對於初學者,您可以嘗試刪除無限視圖代碼並查看問題是否存在。 – cYrixmorten