Java tutorial
/* * Copyright 2016,leobert,The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package individual.leobert.calendar; import android.content.Context; import android.content.res.TypedArray; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.util.AttributeSet; import android.util.SparseArray; import android.view.View; import android.view.ViewGroup; import java.util.Date; import java.util.LinkedList; import static individual.leobert.calendar.CalendarFactory.getMonthOfDayList; public class CalendarDateView extends ViewPager implements CalendarTopView { SparseArray<CalendarView> views = new SparseArray<>(); private CalendarTopViewChangeListener mCalendarLayoutChangeListener; private CalendarView.OnItemClickListener onItemClickListener; private LinkedList<CalendarView> cache = new LinkedList<>(); private int MAXCOUNT = 6; private int row = 6; private CalendarAdapter mAdapter; private int calendarItemHeight = 0; public void setAdapter(CalendarAdapter adapter) { mAdapter = adapter; initData(); } public void setOnItemClickListener(CalendarView.OnItemClickListener onItemClickListener) { this.onItemClickListener = onItemClickListener; } public CalendarDateView(Context context, AttributeSet attrs) { super(context, attrs); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CalendarDateView); row = a.getInteger(R.styleable.CalendarDateView_ilc_calendar_row, 6); a.recycle(); init(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int calendarHeight = 0; if (getAdapter() != null) { CalendarView view = (CalendarView) getChildAt(0); if (view != null) { calendarHeight = view.getMeasuredHeight(); calendarItemHeight = view.getItemHeight(); } } setMeasuredDimension(widthMeasureSpec, MeasureSpec.makeMeasureSpec(calendarHeight, MeasureSpec.EXACTLY)); } private void init() { final int[] dateArr = CalendarUtil.getYMD(new Date()); setAdapter(new PagerAdapter() { @Override public int getCount() { return Integer.MAX_VALUE; } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } @Override public Object instantiateItem(ViewGroup container, final int position) { CalendarView view; if (!cache.isEmpty()) { view = cache.removeFirst(); } else { view = new CalendarView(container.getContext(), row); } view.setOnItemClickListener(onItemClickListener); view.setAdapter(mAdapter); view.setData(getMonthOfDayList(dateArr[0], dateArr[1] + position - Integer.MAX_VALUE / 2), position == Integer.MAX_VALUE / 2); container.addView(view); views.put(position, view); return view; } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); cache.addLast((CalendarView) object); views.remove(position); } }); addOnPageChangeListener(new SimpleOnPageChangeListener() { @Override public void onPageSelected(int position) { super.onPageSelected(position); if (onItemClickListener != null) { CalendarView view = views.get(position); Object[] obs = view.getSelect(); onItemClickListener.onItemClick((View) obs[0], (int) obs[1], (CalendarBean) obs[2]); } mCalendarLayoutChangeListener.onLayoutChange(CalendarDateView.this); } }); } private void initData() { setCurrentItem(Integer.MAX_VALUE / 2, false); getAdapter().notifyDataSetChanged(); } @Override public int[] getCurrentSelectPosition() { CalendarView view = views.get(getCurrentItem()); if (view == null) { view = (CalendarView) getChildAt(0); } if (view != null) { return view.getselectPosition(); } return new int[4]; } @Override public int getItemHeight() { return calendarItemHeight; } @Override public void setCalendarTopViewChangeListener(CalendarTopViewChangeListener listener) { mCalendarLayoutChangeListener = listener; } }