我有一个带有2个标签的FragmentActivity。每个选项卡都调用一个片段 - 日历和转换器:
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,以便用户可以在更改月份时滑动next / prev。
这是我现在的代码。但所有这一切都是显示当月的日历。
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 :(得分:1)
有时触摸事件监听器不能很好地协同工作。为CalendarFragment实现onClickListenr可能会从PagerAdapter中窃取触摸事件。
------编辑-------
如果是Log.d(“Object”,“Instantiated”);每次刷卡时,您的调试日志都会显示,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的方式是维护它在视图之间的状态。
答案 1 :(得分:0)
我被困在这里,因为当用户向右滑动时,我不知道如何在用户滑动左侧和下个月日历时显示上个月日历。
假设GridCellAdapter
写得正确,这应该会自动发生。每个职位都会调用instantiateItem()
,您可以在其中创建适合该职位所涉及的任何月份的GridCellAdapter
,并使用GridCellAdapter
与您返回的View
instantiateItem()
。