2012-09-09 58 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