package com.mm.android.deviceaddmodule.mobilecommon.widget.calendar.day; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Color; import android.support.v7.widget.RecyclerView; import android.view.View; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.widget.AbsListView; import com.mm.android.deviceaddmodule.R; import com.mm.android.deviceaddmodule.mobilecommon.widget.calendar.CalendarUtils; import java.util.Calendar; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; public class SimpleMonthAdapter extends RecyclerView.Adapter implements SimpleMonthView.OnDayClickListener { public static final int MONTHS_IN_YEAR = 12; public static final int NUM_CAN_SELECT = 5; //可选数量 public static final int RANGE_CAN_SELECT = 90; // 可选日期范围 private final TypedArray mTypedArray; private final Context mContext; private final Calendar mMinCalendar; private final Calendar mCurCalendar; private final Integer mFirstMonth; private final Integer mLastMonth; private final Map mSelectedDayList; private final Map mSelectedWeekList; private final Set mSelectedColors; private boolean mIsModeOfDay; public SimpleMonthAdapter(Context context, TypedArray typedArray) { mTypedArray = typedArray; mContext = context; mMinCalendar = Calendar.getInstance(); mMinCalendar.add(Calendar.DAY_OF_MONTH, -RANGE_CAN_SELECT); mCurCalendar = Calendar.getInstance(); mFirstMonth = mMinCalendar.get(Calendar.MONTH); mLastMonth = (mCurCalendar.get(Calendar.MONTH)) % MONTHS_IN_YEAR; mSelectedDayList = new HashMap<>(NUM_CAN_SELECT); mSelectedWeekList = new HashMap<>(NUM_CAN_SELECT); mSelectedColors = new HashSet<>(NUM_CAN_SELECT - 2); init(); } private void init() { mIsModeOfDay = mTypedArray.getBoolean(R.styleable.DayPickerView_modeOfDay, true); // 三种颜色 int mSelectedColor1 = mTypedArray.getColor(R.styleable.DayPickerView_colorSelectedBg1, Color.parseColor(SimpleMonthView.COLOR_SELECTED_BG1)); int mSelectedColor2 = mTypedArray.getColor(R.styleable.DayPickerView_colorSelectedBg2, Color.parseColor(SimpleMonthView.COLOR_SELECTED_BG2)); int mSelectedColor3 = mTypedArray.getColor(R.styleable.DayPickerView_colorSelectedBg3, Color.parseColor(SimpleMonthView.COLOR_SELECTED_BG3)); mSelectedColors.add(mSelectedColor1); mSelectedColors.add(mSelectedColor2); mSelectedColors.add(mSelectedColor3); } @Override public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { final SimpleMonthView simpleMonthView = new SimpleMonthView(mContext, mTypedArray); return new ViewHolder(simpleMonthView, this); } @Override public void onBindViewHolder(ViewHolder viewHolder, int position) { final SimpleMonthView v = viewHolder.simpleMonthView; final HashMap drawingParams = new HashMap<>(); int month; int year; month = (mFirstMonth + (position % MONTHS_IN_YEAR)) % MONTHS_IN_YEAR; year = position / MONTHS_IN_YEAR + mMinCalendar.get(Calendar.YEAR) + ((mFirstMonth + (position % MONTHS_IN_YEAR)) / MONTHS_IN_YEAR); v.reuse(); drawingParams.put(SimpleMonthView.VIEW_PARAMS_YEAR, year); drawingParams.put(SimpleMonthView.VIEW_PARAMS_MONTH, month); drawingParams.put(SimpleMonthView.VIEW_PARAMS_WEEK_START, mMinCalendar.getFirstDayOfWeek()); v.setMonthParams(drawingParams); v.setSelectedDayList(mSelectedDayList); v.setSelectedWeekList(mSelectedWeekList); v.setSelectedColors(mSelectedColors); v.setModeOfDay(mIsModeOfDay); v.setCurrentCalendar(mCurCalendar); v.setMinCalendar(mMinCalendar); v.invalidate(); } public long getItemId(int position) { return position; } @Override public int getItemCount() { int itemCount = (((mCurCalendar.get(Calendar.YEAR) - mMinCalendar.get(Calendar.YEAR)) + 1) * MONTHS_IN_YEAR); itemCount -= mFirstMonth; itemCount -= (MONTHS_IN_YEAR - mLastMonth) - 1; return itemCount; } public static class ViewHolder extends RecyclerView.ViewHolder { final SimpleMonthView simpleMonthView; public ViewHolder(View itemView, SimpleMonthView.OnDayClickListener onDayClickListener) { super(itemView); simpleMonthView = (SimpleMonthView) itemView; simpleMonthView.setLayoutParams(new AbsListView.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); simpleMonthView.setClickable(true); simpleMonthView.setOnDayClickListener(onDayClickListener); } } public void onDayClick(SimpleMonthView simpleMonthView, CalendarDay calendarDay) { if (calendarDay != null) { setSelectedDay(calendarDay); } } public void onDayClick(SimpleMonthView simpleMonthView, SelectedDays selectedDays) { if (selectedDays != null) { setSelectedDay(selectedDays); } } private void setSelectedDay(CalendarDay calendarDay) { if (calendarDay.isYesterday() || calendarDay.isToday()) { return; } if (mSelectedDayList.containsKey(CalendarUtils.getKeyByCalendarDay(calendarDay))) { mSelectedDayList.remove(CalendarUtils.getKeyByCalendarDay(calendarDay)); } else { if (mSelectedDayList.size() < NUM_CAN_SELECT) { mSelectedDayList.put(CalendarUtils.getKeyByCalendarDay(calendarDay), calendarDay); } } notifyDataSetChanged(); } private void setSelectedDay(SelectedDays selectedDays) { if(selectedDays.isThisWeek() || selectedDays.isLastWeek()) { return; } if (mSelectedWeekList.containsKey(CalendarUtils.getKeyByCalendarDay(selectedDays.getFirst()))) { mSelectedWeekList.remove(CalendarUtils.getKeyByCalendarDay(selectedDays.getFirst())); } else { if (mSelectedWeekList.size() < NUM_CAN_SELECT) { mSelectedWeekList.put(CalendarUtils.getKeyByCalendarDay(selectedDays.getFirst()), selectedDays); } } notifyDataSetChanged(); } public void setIsModeOfDay(boolean isModeOfDay) { this.mIsModeOfDay = isModeOfDay; } public Map getSelectedDayList() { return mSelectedDayList; } public void setSelectedDayList(List selectedDayList) { for(CalendarDay calendarDay : selectedDayList) { if(calendarDay != null && !mSelectedDayList.containsKey(CalendarUtils.getKeyByCalendarDay(calendarDay)) && mSelectedDayList.size() < NUM_CAN_SELECT) { if(!calendarDay.isToday() && !calendarDay.isYesterday()) { Iterator it = mSelectedColors.iterator(); if (it.hasNext()) { calendarDay.setColor(it.next()); it.remove(); } } mSelectedDayList.put(CalendarUtils.getKeyByCalendarDay(calendarDay), calendarDay); } } } public Map getSelectedWeekList() { return mSelectedWeekList; } public void setSelectedWeekList(List selectedWeekList) { for(SelectedDays selectedDays : selectedWeekList) { if(selectedDays != null && !mSelectedWeekList.containsKey(CalendarUtils.getKeyByCalendarDay(selectedDays.getFirst())) && mSelectedWeekList.size() < NUM_CAN_SELECT) { if(!selectedDays.isThisWeek() && !selectedDays.isLastWeek()) { Iterator it = mSelectedColors.iterator(); if (it.hasNext()) { selectedDays.getFirst().setColor(it.next()); selectedDays.getLast().setColor(selectedDays.getFirst().getColor()); it.remove(); } } mSelectedWeekList.put(CalendarUtils.getKeyByCalendarDay(selectedDays.getFirst()), selectedDays); } } } }