菜鸟一枚,所以日历的自定义也让我头疼了好几天,主要原因是ViewPager是无限滑动,日期在左右滑动时总是会错乱,看了大神的文章,顿时大悟,特此感谢。
大神文章链接:blog.csdn.net/mostone/article/details/8459759
现在来讲讲怎么实现日历功能,因为水平不够,讲错的地方请指出,谢谢!
先来看实现效果:
样子有点丑
主要就是在ViewPager中添加Fragment,Fragment中界面是自定义的View。
1.ViewPager使用的Adapter是FragmentStatePagerAdapter
public class CalendarPagerAdapter extends FragmentStatePagerAdapter{
public CalendarPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
return CalendarPagerFragment.create(position);
}
@Override
public int getCount() {
int years = DateTimeUtils.getMaxYear()-DateTimeUtils.getMinYear();
return years*12;
}
}
2.Fragment中使用自定义View
public class CalendarPagerFragment extends Fragment{
public static final String MONTH_INDEX = "month_index";
private int monthIndex;
public static CalendarPagerFragment create(int monthIndex){
CalendarPagerFragment fragment = new CalendarPagerFragment();
Bundle bundle = new Bundle();
bundle.putInt(MONTH_INDEX, monthIndex);
fragment.setArguments(bundle);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
monthIndex = getArguments().getInt(MONTH_INDEX);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
ViewGroup view = (ViewGroup) inflater.inflate(R.layout.view_calendar, null);
CalendarView calendarView = new CalendarView(getActivity(), monthIndex);
calendarView.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
view.addView(calendarView);
return view;
}
}
3.自定义View的代码有点长,就不贴了,在最下面会给出下载链接
这里注意一点是,我的代码是从项目中提取出来的,我要做的并不是单纯的日历,而是通过日历展示一些信息,所以是将日历显示范围控制在1990年~2040年(用户很少一页一页翻到这里),这样子节省一些资源。而我的自定义View,通过传进来的monthIndex(在ViewPager中的第几页来判断是哪一年哪一月),来展示每月的日历。