package com.mm.android.deviceaddmodule.mobilecommon.widget.calendar.month; 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 com.mm.android.deviceaddmodule.mobilecommon.widget.calendar.day.SimpleMonthView; 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 MonthSelectAdapter extends RecyclerView.Adapter implements MonthSelectView.OnDayClickListener { public static final int NUM_CAN_SELECT = 5; //可选数量 public static final int RANGE_CAN_SELECT = 36; // 可选月范围 private final TypedArray mTypedArray; private final Context mContext; private final Calendar mMinCalendar; private final Calendar mCurCalendar; private final Map mSelectedMonthList; private final Set mSelectedColors; public MonthSelectAdapter(Context context, TypedArray typedArray) { mTypedArray = typedArray; mContext = context; mMinCalendar = Calendar.getInstance(); mMinCalendar.add(Calendar.MONTH, - RANGE_CAN_SELECT); mCurCalendar = Calendar.getInstance(); mSelectedMonthList = new HashMap<>(NUM_CAN_SELECT); mSelectedColors = new HashSet<>(NUM_CAN_SELECT - 2); init(); } private void init() { // 三种颜色 int mSelectedColor1 = mTypedArray.getColor(R.styleable.DayPickerView_colorSelectedBg1, Color.parseColor(MonthSelectView.COLOR_SELECTED_BG1)); int mSelectedColor2 = mTypedArray.getColor(R.styleable.DayPickerView_colorSelectedBg2, Color.parseColor(MonthSelectView.COLOR_SELECTED_BG2)); int mSelectedColor3 = mTypedArray.getColor(R.styleable.DayPickerView_colorSelectedBg3, Color.parseColor(MonthSelectView.COLOR_SELECTED_BG3)); mSelectedColors.add(mSelectedColor1); mSelectedColors.add(mSelectedColor2); mSelectedColors.add(mSelectedColor3); } @Override public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { final MonthSelectView simpleMonthView = new MonthSelectView(mContext, mTypedArray); return new ViewHolder(simpleMonthView, this); } @Override public void onBindViewHolder(ViewHolder viewHolder, int position) { final MonthSelectView v = viewHolder.simpleMonthView; final HashMap drawingParams = new HashMap<>(); int year = mMinCalendar.get(Calendar.YEAR) + position; v.reuse(); drawingParams.put(SimpleMonthView.VIEW_PARAMS_YEAR, year); drawingParams.put(SimpleMonthView.VIEW_PARAMS_WEEK_START, mMinCalendar.getFirstDayOfWeek()); v.setMonthParams(drawingParams); v.setSelectedMonthList(mSelectedMonthList); v.setSelectedColors(mSelectedColors); 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; return itemCount; } public static class ViewHolder extends RecyclerView.ViewHolder { final MonthSelectView simpleMonthView; public ViewHolder(View itemView, MonthSelectView.OnDayClickListener onDayClickListener) { super(itemView); simpleMonthView = (MonthSelectView) itemView; simpleMonthView.setLayoutParams(new AbsListView.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); simpleMonthView.setClickable(true); simpleMonthView.setOnDayClickListener(onDayClickListener); } } public void onDayClick(MonthSelectView simpleMonthView, SelectedMonth selectedMonth) { if (selectedMonth != null) { setSelectedMonth(selectedMonth); } } private void setSelectedMonth(SelectedMonth selectedMonth) { if (selectedMonth.isThisMonth() || selectedMonth.isLastMonth()) { return; } if (mSelectedMonthList.containsKey(CalendarUtils.getKeyBySelectedMonth(selectedMonth))) { mSelectedMonthList.remove(CalendarUtils.getKeyBySelectedMonth(selectedMonth)); } else { if (mSelectedMonthList.size() < NUM_CAN_SELECT) { mSelectedMonthList.put(CalendarUtils.getKeyBySelectedMonth(selectedMonth), selectedMonth); } } notifyDataSetChanged(); } public Map getSelectedMonthList() { return mSelectedMonthList; } public void setSelectedMonthList(List selectedMonthList) { for(SelectedMonth selectedMonth : selectedMonthList) { if(selectedMonth != null && !mSelectedMonthList.containsKey(CalendarUtils.getKeyBySelectedMonth(selectedMonth)) && mSelectedMonthList.size() < NUM_CAN_SELECT) { if(!selectedMonth.isThisMonth() && !selectedMonth.isLastMonth()) { Iterator it = mSelectedColors.iterator(); if (it.hasNext()) { selectedMonth.setColor(it.next()); it.remove(); } } mSelectedMonthList.put(CalendarUtils.getKeyBySelectedMonth(selectedMonth), selectedMonth); } } } }