2012-09-09 88 views
1

我有一個帶有2個選項卡的FragmentActivity。每個標籤調用片段 - 日曆和轉換器:在自定義日曆中實現ViewPager

public class Calendar extends SherlockFragmentActivity { 

//create tabs 
} 


private class MyTabListener implements ActionBar.TabListener 
{ 
    @Override 
    public void onTabSelected(Tab tab, FragmentTransaction ft) { 
     if(tab.getPosition()==0) 
     { 
      CalendarFragment frag = new CalendarFragment(); 
      ft.replace(android.R.id.content, frag); 
     } 
     else 
     { 
      ConverterFragment frag = new ConverterFragment(); 
      ft.replace(android.R.id.content, frag); 
     } 
    } 
.. 

} 

Calendar fragment,我想實現ViewPager月視圖,以便改變一個月的時候,用戶可以刷卡下一個/上。

這是我到目前爲止的代碼。但是,所有這些都會顯示當前的月曆。

public class CalendarFragment extends Fragment implements OnClickListener { 

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.simple_calendar_view, container, false); 

     //set calendar adapter 
     //Code from http://w2davids.wordpress.com/android-simple-calendar/ 

     context = this.getActivity().getApplicationContext(); 
     CalendarPagerAdapter adapter = new CalendarPagerAdapter(); 
     myPager = (ViewPager) v.findViewById(R.id.pager); 
     myPager.setAdapter(adapter); 
     myPager.setCurrentItem(1); 
    } 


    public class CalendarPagerAdapter extends PagerAdapter { 

     public int getCount() { 
       return NUM_AWESOME_VIEWS; 
     } 

     public Object instantiateItem(View collection, int position) { 
       Log.d("Object", "Instantiated"); 
       LayoutInflater inflater = (LayoutInflater) collection.getContext() 
           .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

       View v = inflater.inflate(R.layout.simple_calendar_view, null); 

       _calendar = Calendar.getInstance(Locale.getDefault()); 
       month = _calendar.get(Calendar.MONTH) + 1; 
       year = _calendar.get(Calendar.YEAR); 

       calendarView = (GridView) v.findViewById(R.id.calendar); 
       calendarWeek = (GridView) v.findViewById(R.id.calendarweek); 

       calendarWeek.setAdapter(new CalendarWeekAdapter(context)); 
       // Initialised 
       adapter = new GridCellAdapter(context, R.id.calendar_day_gridcell, month, year); 
       adapter.notifyDataSetChanged(); 
       calendarView.setAdapter(adapter); 

       ((ViewPager) collection).addView(v, 0); 

       return v; 
     } 

     @Override 
     public void destroyItem(View arg0, int arg1, Object arg2) { 
       ((ViewPager) arg0).removeView((View) arg2); 

     } 

     @Override 
     public void finishUpdate(View arg0) { 
       // TODO Auto-generated method stub 

     } 

     @Override 
     public boolean isViewFromObject(View arg0, Object arg1) { 
       return arg0 == ((View) arg1); 

     } 

     @Override 
     public void restoreState(Parcelable arg0, ClassLoader arg1) { 
       // TODO Auto-generated method stub 

     } 

     @Override 
     public Parcelable saveState() { 
       // TODO Auto-generated method stub 
       return null; 
     } 

     @Override 
     public void startUpdate(View arg0) { 
       // TODO Auto-generated method stub 

     } 

    } 

} 

我堅持在這裏,因爲我不知道如何當用戶在用戶刷卡刷卡右左,下個月日曆顯示上一張月曆。

我試圖將此代碼添加到Object instantiateItem

switch(position){ 
    case 0: 
     Log.d("ViewPager", "Prev"); 
     if (month <= 1) 
      { 
       month = 12; 
       year--; 
      } 
     else 
      { 
       month--; 
      } 
     if (hmonth <= 1) 
      { 
       hmonth = 12; 
       hyear--; 
      } 
     else 
      { 
       hmonth--; 
      } 
     setGridCellAdapterToDate(month, year); 
    break; 
    case 2: 

     Log.d("ViewPager", "Next"); 
     if (month > 11) 
      { 
       month = 1; 
       year++; 
      } 
     else 
      { 
       month++; 
      } 
     if (hmonth > 11) 
      { 
       hmonth = 1; 
       hyear++; 
      } 
     else 
      { 
       hmonth++; 
      } 
     setGridCellAdapterToDate(month, year); 

    break; 
    } 

但是沒有刷卡情況。我哪裏錯了?

+0

NUM_AWESOME_VIEWS的值是什麼? – florianmski

+0

'private static int NUM_AWESOME_VIEWS = 100;' – input

+0

你解決了這個問題嗎? –

回答

1

有時觸摸事件偵聽器不能很好地一起玩。爲CalendarFragment實現onClickListenr可能會竊取PagerAdapter中的觸摸事件。

------ ------- EDIT

如果Log.d( 「對象」, 「實例化」);在你每次刷卡時你的調試日誌都會顯示出來,你的PagerAdapter正在工作。這意味着如何更改當前月份以顯示它是一個問題。

試試這個:

// put this at the class level of calendarFragment. 
Calendar holdTodaysDate = Calendar.getInstance(Locale.getDefault()); 


_calendar = Calendar.getInstance(Locale.getDefault()); 
_calendar = holdTodaysDate; // Add this line; 
_calendar.add(Calendar.MONTH, position); // Add this line 
month = _calendar.get(Calendar.MONTH) + 1; 
year = _calendar.get(Calendar.YEAR); 

這是添加位置之前到日曆,今天的日期復位。現在_calendar的方式是保持視圖之間的狀態。

+0

但我需要實現'onClickListener'來顯示點擊日期的對話框。 – input

+0

如果刪除它修復了刷卡問題,那麼這個問題就解決了。爲了幫助您讓他們一起工作,我們需要查看相關的代碼。 –

+0

不幸的是,它不能解決問題。 – input

0

我被困在這裏,因爲我不知道如何顯示上一個月的日曆,當用戶向左滑動和下個月的日曆時,用戶滑動右鍵。

假設GridCellAdapter寫入正確,這應該會自動發生。將爲每個職位調用instantiateItem(),在此創建適合該職位相關月份的GridCellAdapter,並使用該GridCellAdapterView,您將從instantiateItem()返回。

+0

我正在使用此日曆:http://w2davids.wordpress.com/android-simple-calendar/ GridCellAdapter寫入正確。然而我不確定它爲什麼不揮手。 – input