上下连选的日历

1 图片效果
这里写图片描述
2 代码结构
这里写图片描述
3 代码

package common.com.commoncalendar;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Toast;

import common.com.commoncalendar.Bean.calendars.SlideWayManager;
import common.com.commoncalendar.Utils.DPMode;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        SlideWayManager slideWayManager=new SlideWayManager(MainActivity.this,R.layout.activity_main);
        View view = slideWayManager.SlideMode(DPMode.VERTICAL);
        setContentView(view);
        slideWayManager.setCalendarClickListener(new SlideWayManager.OnCalendarClickListener() {
            @Override
            public void setOnCalendarClickListener(String startDate, String endDate) {
                Toast.makeText(MainActivity.this,"选择范围:startDate"+startDate+",endDate:"+endDate,Toast.LENGTH_SHORT).show();
            }
        });
    }




}


package common.com.commoncalendar.Adapter;

/**
 * Created by zhq_zhao on 2017/12/14.
 */

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;

import java.util.List;

import common.com.commoncalendar.Holder.AllUseViewHolder;

/**
 * Created by zhq_zhao on 2017/8/15.
 */
public abstract class AllUseAdapter<T> extends BaseAdapter {
    private final LayoutInflater inflater;
    private List<T> list;//数据源
    private Context context;
    private int itemlayoutId;

    //在构造方法中传入数据源
    public AllUseAdapter(Context context, List<T> list, int itemlayoutId) {
        this.list = list;
        inflater = LayoutInflater.from(context);
        this.context = context;
        this.itemlayoutId = itemlayoutId;
    }

    //在构造方法中传入数据源
    public AllUseAdapter(Context context, List<T> list, int itemlayoutId,int year, int month, int day) {
        this.list = list;
        inflater = LayoutInflater.from(context);
        this.context = context;
        this.itemlayoutId = itemlayoutId;
    }
    @Override
    public int getCount() {
        return list == null ? 0 : list.size();
    }

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final AllUseViewHolder viewHolder = getViewHolder(position, convertView, parent);
        convert(viewHolder, (T) getItem(position));
        convert(viewHolder, (T) getItem(position), position);
        return viewHolder.getConvertView();
    }

    protected abstract void convert(AllUseViewHolder viewHolder, T item, int position);

    protected  void convert(AllUseViewHolder viewHolder, T item){}

    private AllUseViewHolder getViewHolder(int position, View convertView, ViewGroup parent) {
        return AllUseViewHolder.get(context, convertView, parent, itemlayoutId, position);
    }
}



package common.com.commoncalendar.Bean.calendars;

import java.util.Calendar;
import java.util.HashSet;
import java.util.Set;

/**
 * 月历抽象父类
 * 继承该类可以实现自己的日历对象
 * <p/>
 * Abstract class of Calendar
 *
 * @author AigeStudio 2015-06-15
 */
public abstract class DPCalendar {
    protected final Calendar c = Calendar.getInstance();

    /**
     * 获取某年某月的节日数组
     * <p/>
     * Build the festival date array of given year and month
     *
     * @param year  某年
     * @param month 某月
     * @return 该月节日数组
     */
    public abstract String[][] buildMonthFestival(int year, int month);

    /**
     * 获取某年某月的假期数组
     * <p/>
     * Build the holiday date array of given year and month
     *
     * @param year  某年
     * @param month 某月
     * @return 该月假期数组
     */
    public abstract Set<String> buildMonthHoliday(int year, int month);

    /**
     * 判断某年是否为闰年
     *
     * @param year ...
     * @return true表示闰年
     */
    public boolean isLeapYear(int year) {
        return (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0));
    }

    /**
     * 判断给定日期是否为今天
     *
     * @param year  某年
     * @param month 某月
     * @param day   某天
     * @return ...
     */
    public boolean isToday(int year, int month, int day) {
        Calendar c1 = Calendar.getInstance();
        Calendar c2 = Calendar.getInstance();
        c1.set(year, month - 1, day);
        return (c1.get(Calendar.YEAR) == c2.get(Calendar.YEAR)) &&
                (c1.get(Calendar.MONTH) == (c2.get(Calendar.MONTH))) &&
                (c1.get(Calendar.DAY_OF_MONTH) == c2.get(Calendar.DAY_OF_MONTH));
    }

    /**
     * 生成某年某月的公历天数数组
     * 数组为6x7的二维数组因为一个月的周数永远不会超过六周
     * 天数填充对应相应的二维数组下标
     * 如果某个数组下标中没有对应天数那么则填充一个空字符串
     *
     * @param year  某年
     * @param month 某月
     * @return 某年某月的公历天数数组
     */
    public String[][] buildMonthG(int year, int month) {
        c.clear();
        String tmp[][] = new String[6][7];
        c.set(year, month - 1, 1);

        int daysInMonth = 0;
        if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 ||
                month == 12) {
            daysInMonth = 31;
        } else if (month == 4 || month == 6 || month == 9 || month == 11) {
            daysInMonth = 30;
        } else if (month == 2) {
            if (isLeapYear(year)) {
                daysInMonth = 29;
            } else {
                daysInMonth = 28;
            }
        }
        int dayOfWeek = c.get(Calendar.DAY_OF_WEEK) - Calendar.SUNDAY;
        int day = 1;
        for (int i = 0; i < 6; i++) {
            for (int j = 0; j < 7; j++) {
                tmp[i][j] = "";
                if (i == 0 && j >= dayOfWeek) {
                    tmp[i][j] = "" + day;
                    day++;
                } else if (i > 0 && day <= daysInMonth) {
                    tmp[i][j] = "" + day;
                    day++;
                }
            }
        }
        return tmp;
    }

    /**
     * 生成某年某月的周末日期集合
     *
     * @param year  某年
     * @param month 某月
     * @return 某年某月的周末日期集合
     */
    public Set<String> buildMonthWeekend(int year, int month) {
        Set<String> set = new HashSet<>();
        c.clear();
        c.set(year, month - 1, 1);
        do {
            int day = c.get(Calendar.DAY_OF_WEEK);
            if (day == Calendar.SATURDAY || day == Calendar.SUNDAY) {
                set.add(String.valueOf(c.get(Calendar.DAY_OF_MONTH)));
            }
            c.add(Calendar.DAY_OF_YEAR, 1);
        } while (c.get(Calendar.MONTH) == month - 1);
        return set;
    }

    protected long GToNum(int year, int month, int day) {
        month = (month + 9) % 12;
        year = year - month / 10;
        return 365 * year + year / 4 - year / 100 + year / 400 + (month * 306 + 5) / 10 + (day - 1);
    }

    protected int getBitInt(int data, int length, int shift) {
        return (data & (((1 << length) - 1) << shift)) >> shift;
    }
}


package common.com.commoncalendar.Bean.calendars;

import android.text.TextUtils;

import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;

/**
 * Created by zhq_zhao on 2017/12/19.
 * 中国农历日历管理类
 */
public class LunarCalendar extends DPCalendar {
    private static final int[] FIRST_DAY_OF_LUNAR_IN_GREGORIAN = {1897, 0x75aa, 0x156a, 0x1096d, 0x95c, 0x14ae, 0xaa4d, 0x1a4c, 0x1b2a, 0x8d55, 0xad4, 0x135a, 0x495d, 0x95c, 0xd49b, 0x149a, 0x1a4a, 0xbaa5, 0x16a8, 0x1ad4, 0x52da, 0x12b6, 0xe937, 0x92e, 0x1496, 0xb64b, 0xd4a, 0xda8, 0x95b5, 0x56c, 0x12ae, 0x492f, 0x92e, 0xcc96, 0x1a94, 0x1d4a, 0xada9, 0xb5a, 0x56c, 0x726e, 0x125c, 0xf92d, 0x192a, 0x1a94, 0xdb4a, 0x16aa, 0xad4, 0x955b, 0x4ba, 0x125a, 0x592b, 0x152a, 0xf695, 0xd94, 0x16aa, 0xaab5, 0x9b4, 0x14b6, 0x6a57, 0xa56, 0x1152a, 0x1d2a, 0xd54, 0xd5aa, 0x156a, 0x96c, 0x94ae, 0x14ae, 0xa4c, 0x7d26, 0x1b2a, 0xeb55, 0xad4, 0x12da, 0xa95d, 0x95a, 0x149a, 0x9a4d, 0x1a4a, 0x11aa5, 0x16a8, 0x16d4, 0xd2da, 0x12b6, 0x936, 0x9497, 0x1496, 0x1564b, 0xd4a, 0xda8, 0xd5b4, 0x156c, 0x12ae, 0xa92f, 0x92e, 0xc96, 0x6d4a, 0x1d4a, 0x10d65, 0xb58, 0x156c, 0xb26d, 0x125c, 0x192c, 0x9a95, 0x1a94, 0x1b4a, 0x4b55, 0xad4, 0xf55b, 0x4ba, 0x125a, 0xb92b, 0x152a, 0x1694, 0x96aa, 0x15aa, 0x12ab5, 0x974, 0x14b6, 0xca57, 0xa56, 0x1526, 0x8e95, 0xd54, 0x15aa, 0x49b5, 0x96c, 0xd4ae, 0x149c, 0x1a4c, 0xbd26, 0x1aa6, 0xb54, 0x6d6a, 0x12da, 0x1695d, 0x95a, 0x149a, 0xda4b, 0x1a4a, 0x1aa4, 0xbb54, 0x16b4, 0xada, 0x495b, 0x936, 0xf497, 0x1496, 0x154a, 0xb6a5, 0xda4, 0x15b4, 0x6ab6, 0x126e, 0x1092f, 0x92e, 0xc96, 0xcd4a, 0x1d4a, 0xd64, 0x956c, 0x155c, 0x125c, 0x792e, 0x192c, 0xfa95, 0x1a94, 0x1b4a, 0xab55, 0xad4, 0x14da, 0x8a5d, 0xa5a, 0x1152b, 0x152a, 0x1694, 0xd6aa, 0x15aa, 0xab4, 0x94ba, 0x14b6, 0xa56, 0x7527, 0xd26, 0xee53, 0xd54, 0x15aa, 0xa9b5, 0x96c, 0x14ae, 0x8a4e, 0x1a4c, 0x11d26, 0x1aa4, 0x1b54, 0xcd6a, 0xada, 0x95c, 0x949d, 0x149a, 0x1a2a, 0x5b25, 0x1aa4, 0xfb52};

    private static final int[] DAYS_AND_LEAP_MONTH_OF_LUNAR = {1897, 0xed436, 0xed64a, 0xed83f, 0xeda53, 0xedc48, 0xede3d, 0xee050, 0xee244, 0xee439, 0xee64d, 0xee842, 0xeea36, 0xeec4a, 0xeee3e, 0xef052, 0xef246, 0xef43a, 0xef64e, 0xef843, 0xefa37, 0xefc4b, 0xefe41, 0xf0054, 0xf0248, 0xf043c, 0xf0650, 0xf0845, 0xf0a38, 0xf0c4d, 0xf0e42, 0xf1037, 0xf124a, 0xf143e, 0xf1651, 0xf1846, 0xf1a3a, 0xf1c4e, 0xf1e44, 0xf2038, 0xf224b, 0xf243f, 0xf2653, 0xf2848, 0xf2a3b, 0xf2c4f, 0xf2e45, 0xf3039, 0xf324d, 0xf3442, 0xf3636, 0xf384a, 0xf3a3d, 0xf3c51, 0xf3e46, 0xf403b, 0xf424e, 0xf4443, 0xf4638, 0xf484c, 0xf4a3f, 0xf4c52, 0xf4e48, 0xf503c, 0xf524f, 0xf5445, 0xf5639, 0xf584d, 0xf5a42, 0xf5c35, 0xf5e49, 0xf603e, 0xf6251, 0xf6446, 0xf663b, 0xf684f, 0xf6a43, 0xf6c37, 0xf6e4b, 0xf703f, 0xf7252, 0xf7447, 0xf763c, 0xf7850, 0xf7a45, 0xf7c39, 0xf7e4d, 0xf8042, 0xf8254, 0xf8449, 0xf863d, 0xf8851, 0xf8a46, 0xf8c3b, 0xf8e4f, 0xf9044, 0xf9237, 0xf944a, 0xf963f, 0xf9853, 0xf9a47, 0xf9c3c, 0xf9e50, 0xfa045, 0xfa238, 0xfa44c, 0xfa641, 0xfa836, 0xfaa49, 0xfac3d, 0xfae52, 0xfb047, 0xfb23a, 0xfb44e, 0xfb643, 0xfb837, 0xfba4a, 0xfbc3f, 0xfbe53, 0xfc048, 0xfc23c, 0xfc450, 0xfc645, 0xfc839, 0xfca4c, 0xfcc41, 0xfce36, 0xfd04a, 0xfd23d, 0xfd451, 0xfd646, 0xfd83a, 0xfda4d, 0xfdc43, 0xfde37, 0xfe04b, 0xfe23f, 0xfe453, 0xfe648, 0xfe83c, 0xfea4f, 0xfec44, 0xfee38, 0xff04c, 0xff241, 0xff436, 0xff64a, 0xff83e, 0xffa51, 0xffc46, 0xffe3a, 0x10004e, 0x100242, 0x100437, 0x10064b, 0x100841, 0x100a53, 0x100c48, 0x100e3c, 0x10104f, 0x101244, 0x101438, 0x10164c, 0x101842, 0x101a35, 0x101c49, 0x101e3d, 0x102051, 0x102245, 0x10243a, 0x10264e, 0x102843, 0x102a37, 0x102c4b, 0x102e3f, 0x103053, 0x103247, 0x10343b, 0x10364f, 0x103845, 0x103a38, 0x103c4c, 0x103e42, 0x104036, 0x104249, 0x10443d, 0x104651, 0x104846, 0x104a3a, 0x104c4e, 0x104e43, 0x105038, 0x10524a, 0x10543e, 0x105652, 0x105847, 0x105a3b, 0x105c4f, 0x105e45, 0x106039, 0x10624c, 0x106441, 0x106635, 0x106849, 0x106a3d};

    private static final String[] NUMBER_CAPITAL = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"};

    private static final String[] LUNAR_HEADER = {"初", "十", "廿", "卅", "正", "腊", "冬", "闰"};

    private static final String[][] FESTIVAL_G = {
            {"元旦"},
            {"世界湿地日", "情人节"},
            {"全国爱耳日", "青年志愿者服务日", "国际妇女节", "保护母亲河日", "中国植树节", "白色情人节&国际警察日", "世界消费者权益日", "世界森林日&世界睡眠日", "世界水日", "世界气象日", "世界防治结核病日"},
            {"愚人节", "清明节", "世界卫生日", "世界地球日", "世界知识产权日"},
            {"国际劳动节", "世界哮喘日", "中国青年节", "世界红十字日", "国际护士节", "国际家庭日", "世界电信日", "全国学生营养日", "国际生物多样性日", "国际牛奶日", "世界无烟日"},
            {"国际儿童节", "世界环境日", "全国爱眼日", "世界防治荒漠化日", "国际奥林匹克日", "全国土地日", "国际禁毒日"},
            {"中国共产党诞生日&国际建筑日", "中国抗战纪念日", "世界人口日"},
            {"中国解放军建军节", "国际青年节"},
            {"抗战胜利日", "国际扫盲日", "中国教师节", "中国脑健康日&臭氧层保护日", "全国爱牙日", "世界停火日", "世界旅游日"},
            {"国庆节&国际老年人日", "世界动物日", "世界教师日", "全国高血压日", "世界邮政日", "世界精神卫生日", "世界标准日", "国际盲人节&世界农村妇女日", "世界粮食日", "国际消除贫困日", "联合国日&世界发展新闻日", "中国男性健康日", "万圣节"},
            {"中国记者节", "消防宣传日", "世界糖尿病日", "国际大学生节", "消除对妇女暴力日"},
            {"世界爱滋病日", "世界残疾人日", "全国法制宣传日", "世界足球日", "圣诞节"}};

    private static final int[][] FESTIVAL_G_DATE = {
            {1},
            {2, 14},
            {3, 5, 8, 9, 12, 14, 15, 21, 22, 23, 24},
            {1, 5, 7, 22, 26},
            {1, 3, 4, 8, 12, 15, 17, 20, 22, 23, 31},
            {1, 5, 6, 17, 23, 25, 26},
            {1, 7, 11},
            {1, 12},
            {3, 8, 10, 16, 20, 21, 27},
            {1, 4, 5, 8, 9, 10, 14, 15, 16, 17, 24, 29, 31},
            {8, 9, 14, 17, 25},
            {1, 3, 4, 9, 25}};

    private static final String[][] FESTIVAL_L = {{"春节", "元宵节"},
            {},
            {},
            {},
            {"端午节"},
            {},
            {"乞巧节"},
            {"中秋节"},
            {"重阳节"},
            {},
            {},
            {"腊八节", "扫房日"}};

    private static final int[][] FESTIVAL_L_DATE = {
            {1, 15},
            {},
            {},
            {},
            {5},
            {},
            {7},
            {15},
            {9},
            {},
            {},
            {8, 24}};

    private static final String[][] HOLIDAY = {{"1", "2", "3"}, {"18", "19", "20", "21", "22", "23", "24"}, {""}, {"4", "5", "6"}, {"1", "2", "3"}, {"20", "21", "22"}, {""}, {""}, {"3", "4", "5", "26", "27"}, {"1", "2", "3", "4", "5", "6", "7"}, {""}, {""}};

    private static final String[][] DEFERRED = {{"4"}, {"15", "16", "17", "25", "26", "27", "28"}, {""}, {""}, {""}, {""}, {""}, {""}, {"6", "28", "29", "30"}, {"8", "9", "10"}, {""}, {""}};

    private static final String SOLAR_TERM[][] = {{"小寒", "大寒"}, {"立春", "雨水"}, {"惊蛰", "春分"}, {"清明", "谷雨"}, {"立夏", "小满"}, {"芒种", "夏至"}, {"小暑", "大暑"}, {"立秋", "处暑"}, {"白露", "秋分"}, {"寒露", "霜降"}, {"立冬", "小雪"}, {"大雪", "冬至"}};

    private final HashMap<Integer, String[][]> CACHE_SOLAR_TERM = new HashMap<>();

    private SolarTerm mSolarTerm = new SolarTerm();

    private class G {
        int d;
        int m;
        int y;
    }

    private class L {
        int d;
        int m;
        int y;

        boolean isLeap;
    }

    /**获取某年某月的节日数组
     *
     * @param year  某年
     * @param month 某月
     * @return
     */
    @Override
    public String[][] buildMonthFestival(int year, int month) {
        return buildMonthL(year, month);
    }

    /**获取某年某月的假期数组
     *
     * @param year  某年
     * @param month 某月
     * @return
     */
    @Override
    public Set<String> buildMonthHoliday(int year, int month) {
        Set<String> tmp = new HashSet<>();
        if (year == 2015) {
            Collections.addAll(tmp, HOLIDAY[month - 1]);
        }
        return tmp;
    }

    /**获取某年某月的节日数组
     *
     * @param year
     * @param month
     * @return
     */
    private String[][] buildMonthL(int year, int month) {
        String[][] gregorianMonth = buildMonthG(year, month);
        G g = new G();
        String tmp[][] = new String[6][7];
        for (int i = 0; i < tmp.length; i++) {
            for (int j = 0; j < tmp[0].length; j++) {
                tmp[i][j] = "";
                if (!TextUtils.isEmpty(gregorianMonth[i][j])) {
                    g.y = year;
                    g.m = month;
                    g.d = Integer.valueOf(gregorianMonth[i][j]);
                    L l = null;
                    String result = "";
                    if (year >= 1900 && year <= 2100) {
                        l = GTL(g);
                        result = getFestivalL(l.m, l.d);
                    }
                    if (TextUtils.isEmpty(result)) {
                        result = getFestivalG(g.m, g.d);
                        if (TextUtils.isEmpty(result)) {
                            result = getSolarTerm(year, month, g.d);
                            if (null != l && TextUtils.isEmpty(result)) {
                                char[] c = String.valueOf(l.d).toCharArray();
                                tmp[i][j] = lNumToStr(c);
                            } else {
                                tmp[i][j] = result;
                            }
                        } else {
                            tmp[i][j] = result;
                        }
                    } else {
                        tmp[i][j] = result ;
                    }
                }
            }
        }
        return tmp;
    }

    /**
     * 判断某年某月某日是否为节气
     *
     * @param year  公历年
     * @param month 公历月
     * @param day   公历日
     * @return ...
     */
    public boolean isSolarTerm(int year, int month, int day) {
        return null == getSolarTerm(year, month, day);
    }

    /**
     * 判断某月某日是否为补休
     *
     * @param year  公历年
     * @param month 公历月
     * @param day   公历日
     * @return ...
     */
    public boolean isDeferred(int year, int month, int day) {
        if (year == 2015) {
            String[] deferredOfMonth = DEFERRED[month - 1];
            for (String s : deferredOfMonth) {
                if (!TextUtils.isEmpty(s) && Integer.valueOf(s) == day) return true;
            }
        }
        return false;
    }

    /**断某年某月某日是否为节气
     *
     * @param year
     * @param month
     * @param day
     * @return
     */
    private String getSolarTerm(int year, int month, int day) {
        String[][] tmp = CACHE_SOLAR_TERM.get(year);
        if (null == tmp) {
            tmp = mSolarTerm.buildSolarTerm(year);
            CACHE_SOLAR_TERM.put(year, tmp);
        }
        String[] STOfMonth = tmp[month - 1];
        if (Integer.valueOf(STOfMonth[0]) == day) {
            return SOLAR_TERM[month - 1][0];
        } else if (Integer.valueOf(STOfMonth[1]) == day) {
            return SOLAR_TERM[month - 1][1];
        }
        return "";
    }

    /**获取某年某月的节日数组
     *
     * @param month
     * @param day
     * @return
     */
    private String getFestivalL(int month, int day) {
        String tmp = "";
        int[] daysInMonth = FESTIVAL_L_DATE[month - 1];
        for (int i = 0; i < daysInMonth.length; i++) {
            if (day == daysInMonth[i]) {
                tmp = FESTIVAL_L[month - 1][i];
            }
        }
        return tmp;
    }

    /**获取某年某月的节日数组
     *
     * @param month
     * @param day
     * @return
     */
    private String getFestivalG(int month, int day) {
        String tmp = "";
        int[] daysInMonth = FESTIVAL_G_DATE[month - 1];
        for (int i = 0; i < daysInMonth.length; i++) {
            if (day == daysInMonth[i]) {
                tmp = FESTIVAL_G[month - 1][i];
            }
        }
        return tmp;
    }

    /**获取某年某月的节日数组
     *
     * @param g
     * @return
     */
    private L GTL(G g) {
        int index = g.y - DAYS_AND_LEAP_MONTH_OF_LUNAR[0];
        int data = (g.y << 9) | (g.m << 5) | (g.d);
        int lunarFirstDayInGregorian;
        if (DAYS_AND_LEAP_MONTH_OF_LUNAR[index] > data) {
            index--;
        }
        lunarFirstDayInGregorian = DAYS_AND_LEAP_MONTH_OF_LUNAR[index];

        int y = getBitInt(lunarFirstDayInGregorian, 12, 9);
        int m = getBitInt(lunarFirstDayInGregorian, 4, 5);
        int d = getBitInt(lunarFirstDayInGregorian, 5, 0);

        long offset = GToNum(g.y, g.m, g.d) - GToNum(y, m, d);
        int days = FIRST_DAY_OF_LUNAR_IN_GREGORIAN[index];
        int leap = getBitInt(days, 4, 13);

        int lunarY = index + DAYS_AND_LEAP_MONTH_OF_LUNAR[0];
        int lunarM = 1;
        int lunarD;
        offset += 1;

        for (int i = 0; i < 13; i++) {
            int dm = getBitInt(days, 1, 12 - i) == 1 ? 30 : 29;
            if (offset > dm) {
                lunarM++;
                offset -= dm;
            } else {
                break;
            }
        }
        lunarD = (int) (offset);
        L l = new L();
        l.y = lunarY;
        l.m = lunarM;
        l.isLeap = false;
        if (leap != 0 && lunarM > leap) {
            l.m = lunarM - 1;
            if (lunarM == leap + 1) {
                l.isLeap = true;
            }
        }
        l.d = lunarD;
        return l;
    }

    /**获取某年某月的节日数组
     *
     * @param c
     * @return
     */
    private String lNumToStr(char[] c) {
        String result = "";
        if (c.length == 1) {
            for (int i = 1; i < 10; i++) {
                if (c[0] == String.valueOf(i).charAt(0)) {
                    result = LUNAR_HEADER[0] + NUMBER_CAPITAL[i];
                }
            }
        } else {
            if (c[0] == '1') {
                if (c[1] == '0') {
                    result = LUNAR_HEADER[0] + LUNAR_HEADER[1];
                } else {
                    for (int i = 1; i < 10; i++) {
                        if (c[1] == String.valueOf(i).charAt(0)) {
                            result = LUNAR_HEADER[1] + NUMBER_CAPITAL[i];
                        }
                    }
                }
            } else if (c[0] == '2') {
                if (c[1] == '0') {
                    result = LUNAR_HEADER[2] + LUNAR_HEADER[1];
                } else {
                    for (int i = 1; i < 10; i++) {
                        if (c[1] == String.valueOf(i).charAt(0)) {
                            result = LUNAR_HEADER[2] + NUMBER_CAPITAL[i];
                        }
                    }
                }
            } else {
                if (c[1] == '0') {
                    result = LUNAR_HEADER[3] + LUNAR_HEADER[1];
                } else {
                    for (int i = 1; i < 10; i++) {
                        if (c[1] == String.valueOf(i).charAt(0)) {
                            result = LUNAR_HEADER[3] + NUMBER_CAPITAL[i];
                        }
                    }
                }
            }
        }
        return result;
    }
}


package common.com.commoncalendar.Bean.calendars;

import android.content.Context;
import android.view.View;

import common.com.commoncalendar.Utils.DPMode;

/**
 * Created by zhq_zhao on 2017/12/21.
 * 管理水平滑动和上下滑动日历操作管理
 */
public  class SlideWayManager {
    private Context context;
    private int layoutId;
    private  View   view ;
    public SlideWayManager(Context context,int layoutId){
        this.context=context;
        this.layoutId=layoutId;
    }
    //管理的滑动方式
    public View SlideMode(DPMode mode) {
        if (mode.equals(DPMode.HORIZONTAL)) {//上下滑动

        } else if (mode.equals(DPMode.VERTICAL)) {//水平滑动
            VerticalSlideCalendar verticalSlideCalendar = new VerticalSlideCalendar(context);
             view = verticalSlideCalendar.getCalendarView(context, layoutId);
             initOnclickListener(verticalSlideCalendar);
        }
        return view;
    }

    private void initOnclickListener(VerticalSlideCalendar verticalSlideCalendar) {
        verticalSlideCalendar.setmOnTwoClickListener(new VerticalSlideCalendar.OnTwoClickListener() {
            @Override
            public void setOnTwoClickListener(String startDate, String endDate) {
                if(startDate!=null&&endDate!=null){
                    if(mOnCalendarClickListener!=null){
                        mOnCalendarClickListener.setOnCalendarClickListener(startDate,endDate);
                    }
                }
            }
        });
    }
    private OnCalendarClickListener mOnCalendarClickListener;

    public interface OnCalendarClickListener {
        void setOnCalendarClickListener(String startDate, String endDate);
    }

    public void setCalendarClickListener(OnCalendarClickListener mOnCalendarClickListener) {
        this.mOnCalendarClickListener = mOnCalendarClickListener;
    }
}


package common.com.commoncalendar.Bean.calendars;


import common.com.commoncalendar.Utils.DataUtils;

/**
 * 农历二十四节气算法
 * 该算法目前仅对外提供一个接口方法获取某年的节气数据{@link #buildSolarTerm(int)}
 *
 * Algorithm of lunar solar term.
 * This algorithm provide a public method to get the all solar term of year.{@link #buildSolarTerm(int)}
 *
 * @author AigeStudio 2015-06-16
 */
final class SolarTerm {
    private static final double E10[] = {1.75347045673, 0.00000000000, 0.0000000000, 0.03341656456, 4.66925680417, 6283.0758499914, 0.00034894275, 4.62610241759, 12566.1516999828, 0.00003417571, 2.82886579606, 3.5231183490, 0.00003497056, 2.74411800971, 5753.3848848968, 0.00003135896, 3.62767041758, 77713.7714681205, 0.00002676218, 4.41808351397, 7860.4193924392, 0.00002342687, 6.13516237631, 3930.2096962196, 0.00001273166, 2.03709655772, 529.6909650946, 0.00001324292, 0.74246356352, 11506.7697697936, 0.00000901855, 2.04505443513, 26.2983197998, 0.00001199167, 1.10962944315, 1577.3435424478, 0.00000857223, 3.50849156957, 398.1490034082, 0.00000779786, 1.17882652114, 5223.6939198022, 0.00000990250, 5.23268129594, 5884.9268465832, 0.00000753141, 2.53339053818, 5507.5532386674, 0.00000505264, 4.58292563052, 18849.2275499742, 0.00000492379, 4.20506639861, 775.5226113240, 0.00000356655, 2.91954116867, 0.0673103028, 0.00000284125, 1.89869034186, 796.2980068164, 0.00000242810, 0.34481140906, 5486.7778431750, 0.00000317087, 5.84901952218, 11790.6290886588, 0.00000271039, 0.31488607649, 10977.0788046990, 0.00000206160, 4.80646606059, 2544.3144198834, 0.00000205385, 1.86947813692, 5573.1428014331, 0.00000202261, 2.45767795458, 6069.7767545534, 0.00000126184, 1.08302630210, 20.7753954924, 0.00000155516, 0.83306073807, 213.2990954380, 0.00000115132, 0.64544911683, 0.9803210682, 0.00000102851, 0.63599846727, 4694.0029547076, 0.00000101724, 4.26679821365, 7.1135470008, 0.00000099206, 6.20992940258, 2146.1654164752, 0.00000132212, 3.41118275555, 2942.4634232916, 0.00000097607, 0.68101272270, 155.4203994342, 0.00000085128, 1.29870743025, 6275.9623029906, 0.00000074651, 1.75508916159, 5088.6288397668, 0.00000101895, 0.97569221824, 15720.8387848784, 0.00000084711, 3.67080093025, 71430.6956181291, 0.00000073547, 4.67926565481, 801.8209311238, 0.00000073874, 3.50319443167, 3154.6870848956, 0.00000078756, 3.03698313141, 12036.4607348882, 0.00000079637, 1.80791330700, 17260.1546546904, 0.00000085803, 5.98322631256, 161000.6857376741, 0.00000056963, 2.78430398043, 6286.5989683404, 0.00000061148, 1.81839811024, 7084.8967811152, 0.00000069627, 0.83297596966, 9437.7629348870, 0.00000056116, 4.38694880779, 14143.4952424306, 0.00000062449, 3.97763880587, 8827.3902698748, 0.00000051145, 0.28306864501, 5856.4776591154, 0.00000055577, 3.47006009062, 6279.5527316424, 0.00000041036, 5.36817351402, 8429.2412664666, 0.00000051605, 1.33282746983, 1748.0164130670, 0.00000051992, 0.18914945834, 12139.5535091068, 0.00000049000, 0.48735065033, 1194.4470102246, 0.00000039200, 6.16832995016, 10447.3878396044, 0.00000035566, 1.77597314691, 6812.7668150860, 0.00000036770, 6.04133859347, 10213.2855462110, 0.00000036596, 2.56955238628, 1059.3819301892, 0.00000033291, 0.59309499459, 17789.8456197850, 0.00000035954, 1.70876111898, 2352.8661537718};

    private static final double E11[] = {6283.31966747491, 0.00000000000, 0.0000000000, 0.00206058863, 2.67823455584, 6283.0758499914, 0.00004303430, 2.63512650414, 12566.1516999828, 0.00000425264, 1.59046980729, 3.5231183490, 0.00000108977, 2.96618001993, 1577.3435424478, 0.00000093478, 2.59212835365, 18849.2275499742, 0.00000119261, 5.79557487799, 26.2983197998, 0.00000072122, 1.13846158196, 529.6909650946, 0.00000067768, 1.87472304791, 398.1490034082, 0.00000067327, 4.40918235168, 5507.5532386674, 0.00000059027, 2.88797038460, 5223.6939198022, 0.00000055976, 2.17471680261, 155.4203994342, 0.00000045407, 0.39803079805, 796.2980068164, 0.00000036369, 0.46624739835, 775.5226113240, 0.00000028958, 2.64707383882, 7.1135470008, 0.00000019097, 1.84628332577, 5486.7778431750, 0.00000020844, 5.34138275149, 0.9803210682, 0.00000018508, 4.96855124577, 213.2990954380, 0.00000016233, 0.03216483047, 2544.3144198834, 0.00000017293, 2.99116864949, 6275.9623029906};

    private static final double E12[] = {0.00052918870, 0.00000000000, 0.0000000000, 0.00008719837, 1.07209665242, 6283.0758499914, 0.00000309125, 0.86728818832, 12566.1516999828, 0.00000027339, 0.05297871691, 3.5231183490, 0.00000016334, 5.18826691036, 26.2983197998, 0.00000015752, 3.68457889430, 155.4203994342, 0.00000009541, 0.75742297675, 18849.2275499742, 0.00000008937, 2.05705419118, 77713.7714681205, 0.00000006952, 0.82673305410, 775.5226113240, 0.00000005064, 4.66284525271, 1577.3435424478};

    private static final double E13[] = {0.00000289226, 5.84384198723, 6283.0758499914, 0.00000034955, 0.00000000000, 0.0000000000, 0.00000016819, 5.48766912348, 12566.1516999828};

    private static final double E14[] = {0.00000114084, 3.14159265359, 0.0000000000, 0.00000007717, 4.13446589358, 6283.0758499914, 0.00000000765, 3.83803776214, 12566.1516999828};

    private static final double E15[] = {0.00000000878, 3.14159265359, 0.0000000000};

    private static final double E20[] = {0.00000279620, 3.19870156017, 84334.6615813083, 0.00000101643, 5.42248619256, 5507.5532386674, 0.00000080445, 3.88013204458, 5223.6939198022, 0.00000043806, 3.70444689758, 2352.8661537718, 0.00000031933, 4.00026369781, 1577.3435424478, 0.00000022724, 3.98473831560, 1047.7473117547, 0.00000016392, 3.56456119782, 5856.4776591154, 0.00000018141, 4.98367470263, 6283.0758499914, 0.00000014443, 3.70275614914, 9437.7629348870, 0.00000014304, 3.41117857525, 10213.2855462110};

    private static final double E21[] = {0.00000009030, 3.89729061890, 5507.5532386674, 0.00000006177, 1.73038850355, 5223.6939198022};

    private static final double E30[] = {1.00013988799, 0.00000000000, 0.0000000000, 0.01670699626, 3.09846350771, 6283.0758499914, 0.00013956023, 3.05524609620, 12566.1516999828, 0.00003083720, 5.19846674381, 77713.7714681205, 0.00001628461, 1.17387749012, 5753.3848848968, 0.00001575568, 2.84685245825, 7860.4193924392, 0.00000924799, 5.45292234084, 11506.7697697936, 0.00000542444, 4.56409149777, 3930.2096962196};

    private static final double E31[] = {0.00103018608, 1.10748969588, 6283.0758499914, 0.00001721238, 1.06442301418, 12566.1516999828, 0.00000702215, 3.14159265359, 0.0000000000};

    private static final double E32[] = {0.00004359385, 5.78455133738, 6283.0758499914};

    private static final double E33[] = {0.00000144595, 4.27319435148, 6283.0758499914};

    private static final double M10[] = {22639.5858800, 2.3555545723, 8328.6914247251, 1.5231275E-04, 2.5041111E-07, -1.1863391E-09, 4586.4383203, 8.0413790709, 7214.0628654588, -2.1850087E-04, -1.8646419E-07, 8.7760973E-10, 2369.9139357, 10.3969336431, 15542.7542901840, -6.6188121E-05, 6.3946925E-08, -3.0872935E-10, 769.0257187, 4.7111091445, 16657.3828494503, 3.0462550E-04, 5.0082223E-07, -2.3726782E-09, -666.4175399, -0.0431256817, 628.3019552485, -2.6638815E-06, 6.1639211E-10, -5.4439728E-11, -411.5957339, 3.2558104895, 16866.9323152810, -1.2804259E-04, -9.8998954E-09, 4.0433461E-11, 211.6555524, 5.6858244986, -1114.6285592663, -3.7081362E-04, -4.3687530E-07, 2.0639488E-09, 205.4359530, 8.0845047526, 6585.7609102104, -2.1583699E-04, -1.8708058E-07, 9.3204945E-10, 191.9561973, 12.7524882154, 23871.4457149091, 8.6124629E-05, 3.1435804E-07, -1.4950684E-09, 164.7286185, 10.4400593249, 14914.4523349355, -6.3524240E-05, 6.3330532E-08, -2.5428962E-10, -147.3213842, -2.3986802540, -7700.3894694766, -1.5497663E-04, -2.4979472E-07, 1.1318993E-09, -124.9881185, 5.1984668216, 7771.3771450920, -3.3094061E-05, 3.1973462E-08, -1.5436468E-10, -109.3803637, 2.3124288905, 8956.9933799736, 1.4964887E-04, 2.5102751E-07, -1.2407788E-09, 55.1770578, 7.1411231536, -1324.1780250970, 6.1854469E-05, 7.3846820E-08, -3.4916281E-10, -45.0996092, 5.6113650618, 25195.6237400061, 2.4270161E-05, 2.4051122E-07, -1.1459056E-09, 39.5333010, -0.9002559173, -8538.2408905558, 2.8035534E-04, 2.6031101E-07, -1.2267725E-09, 38.4298346, 18.4383127140, 22756.8171556428, -2.8468899E-04, -1.2251727E-07, 5.6888037E-10, 36.1238141, 7.0666637168, 24986.0742741754, 4.5693825E-04, 7.5123334E-07, -3.5590172E-09, 30.7725751, 16.0827581417, 14428.1257309177, -4.3700174E-04, -3.7292838E-07, 1.7552195E-09, -28.3971008, 7.9982533891, 7842.3648207073, -2.2116475E-04, -1.8584780E-07, 8.2317000E-10, -24.3582283, 10.3538079614, 16171.0562454324, -6.8852003E-05, 6.4563317E-08, -3.6316908E-10, -18.5847068, 2.8429122493, -557.3142796331, -1.8540681E-04, -2.1843765E-07, 1.0319744E-09, 17.9544674, 5.1553411398, 8399.6791003405, -3.5757942E-05, 3.2589854E-08, -2.0880440E-10, 14.5302779, 12.7956138971, 23243.1437596606, 8.8788511E-05, 3.1374165E-07, -1.4406287E-09, 14.3796974, 15.1080427876, 32200.1371396342, 2.3843738E-04, 5.6476915E-07, -2.6814075E-09, 14.2514576, -24.0810366320, -2.3011998397, 1.5231275E-04, 2.5041111E-07, -1.1863391E-09, 13.8990596, 20.7938672862, 31085.5085803679, -1.3237624E-04, 1.2789385E-07, -6.1745870E-10, 13.1940636, 3.3302699264, -9443.3199839914, -5.2312637E-04, -6.8728642E-07, 3.2502879E-09, -9.6790568, -4.7542348263, -16029.0808942018, -3.0728938E-04, -5.0020584E-07, 2.3182384E-09, -9.3658635, 11.2971895604, 24080.9951807398, -3.4654346E-04, -1.9636409E-07, 9.1804319E-10, 8.6055318, 5.7289501804, -1742.9305145148, -3.6814974E-04, -4.3749170E-07, 2.1183885E-09, -8.4530982, 7.5540213938, 16100.0685698171, 1.1921869E-04, 2.8238458E-07, -1.3407038E-09, 8.0501724, 10.4831850066, 14286.1503796870, -6.0860358E-05, 6.2714140E-08, -1.9984990E-10, -7.6301553, 4.6679834628, 17285.6848046987, 3.0196162E-04, 5.0143862E-07, -2.4271179E-09, -7.4474952, -0.0862513635, 1256.6039104970, -5.3277630E-06, 1.2327842E-09, -1.0887946E-10, 7.3712011, 8.1276304344, 5957.4589549619, -2.1317311E-04, -1.8769697E-07, 9.8648918E-10, 7.0629900, 0.9591375719, 33.7570471374, -3.0829302E-05, -3.6967043E-08, 1.7385419E-10, -6.3831491, 9.4966777258, 7004.5133996281, 2.1416722E-04, 3.2425793E-07, -1.5355019E-09, -5.7416071, 13.6527441326, 32409.6866054649, -1.9423071E-04, 5.4047029E-08, -2.6829589E-10, 4.3740095, 18.4814383957, 22128.5152003943, -2.8202511E-04, -1.2313366E-07, 6.2332010E-10, -3.9976134, 7.9669196340, 33524.3151647312, 1.7658291E-04, 4.9092233E-07, -2.3322447E-09, -3.2096876, 13.2398458924, 14985.4400105508, -2.5159493E-04, -1.5449073E-07, 7.2324505E-10, -2.9145404, 12.7093625336, 24499.7476701576, 8.3460748E-05, 3.1497443E-07, -1.5495082E-09, 2.7318890, 16.1258838235, 13799.8237756692, -4.3433786E-04, -3.7354477E-07, 1.8096592E-09, -2.5679459, -2.4418059357, -7072.0875142282, -1.5764051E-04, -2.4917833E-07, 1.0774596E-09, -2.5211990, 7.9551277074, 8470.6667759558, -2.2382863E-04, -1.8523141E-07, 7.6873027E-10, 2.4888871, 5.6426988169, -486.3266040178, -3.7347750E-04, -4.3625891E-07, 2.0095091E-09, 2.1460741, 7.1842488353, -1952.4799803455, 6.4518350E-05, 7.3230428E-08, -2.9472308E-10, 1.9777270, 23.1494218585, 39414.2000050930, 1.9936508E-05, 3.7830496E-07, -1.8037978E-09, 1.9336825, 9.4222182890, 33314.7656989005, 6.0925100E-04, 1.0016445E-06, -4.7453563E-09, 1.8707647, 20.8369929680, 30457.2066251194, -1.2971236E-04, 1.2727746E-07, -5.6301898E-10, -1.7529659, 0.4873576771, -8886.0057043583, -3.3771956E-04, -4.6884877E-07, 2.2183135E-09, -1.4371624, 7.0979974718, -695.8760698485, 5.9190587E-05, 7.4463212E-08, -4.0360254E-10, -1.3725701, 1.4552986550, -209.5494658307, 4.3266809E-04, 5.1072212E-07, -2.4131116E-09, 1.2618162, 7.5108957121, 16728.3705250656, 1.1655481E-04, 2.8300097E-07, -1.3951435E-09};

    private static final double M11[] = {1.6768000, -0.0431256817, 628.3019552485, -2.6638815E-06, 6.1639211E-10, -5.4439728E-11, 0.5164200, 11.2260974062, 6585.7609102104, -2.1583699E-04, -1.8708058E-07, 9.3204945E-10, 0.4138300, 13.5816519784, 14914.4523349355, -6.3524240E-05, 6.3330532E-08, -2.5428962E-10, 0.3711500, 5.5402729076, 7700.3894694766, 1.5497663E-04, 2.4979472E-07, -1.1318993E-09, 0.2756000, 2.3124288905, 8956.9933799736, 1.4964887E-04, 2.5102751E-07, -1.2407788E-09, 0.2459863, -25.6198212459, -2.3011998397, 1.5231275E-04, 2.5041111E-07, -1.1863391E-09, 0.0711800, 7.9982533891, 7842.3648207073, -2.2116475E-04, -1.8584780E-07, 8.2317000E-10, 0.0612800, 10.3538079614, 16171.0562454324, -6.8852003E-05, 6.4563317E-08, -3.6316908E-10};

    private static final double M12[] = {0.0048700, -0.0431256817, 628.3019552485, -2.6638815E-06, 6.1639211E-10, -5.4439728E-11, 0.0022800, -27.1705318325, -2.3011998397, 1.5231275E-04, 2.5041111E-07, -1.1863391E-09, 0.0015000, 11.2260974062, 6585.7609102104, -2.1583699E-04, -1.8708058E-07, 9.3204945E-10};

    private static final double M20[] = {18461.2400600, 1.6279052448, 8433.4661576405, -6.4021295E-05, -4.9499477E-09, 2.0216731E-11, 1010.1671484, 3.9834598170, 16762.1575823656, 8.8291456E-05, 2.4546117E-07, -1.1661223E-09, 999.6936555, 0.7276493275, -104.7747329154, 2.1633405E-04, 2.5536106E-07, -1.2065558E-09, 623.6524746, 8.7690283983, 7109.2881325435, -2.1668263E-06, 6.8896872E-08, -3.2894608E-10, 199.4837596, 9.6692843156, 15647.5290230993, -2.8252217E-04, -1.9141414E-07, 8.9782646E-10, 166.5741153, 6.4134738261, -1219.4032921817, -1.5447958E-04, -1.8151424E-07, 8.5739300E-10, 117.2606951, 12.0248388879, 23976.2204478244, -1.3020942E-04, 5.8996977E-08, -2.8851262E-10, 61.9119504, 6.3390143893, 25090.8490070907, 2.4060421E-04, 4.9587228E-07, -2.3524614E-09, 33.3572027, 11.1245829706, 15437.9795572686, 1.5014592E-04, 3.1930799E-07, -1.5152852E-09, 31.7596709, 3.0832038997, 8223.9166918098, 3.6864680E-04, 5.0577218E-07, -2.3928949E-09, 29.5766003, 8.8121540801, 6480.9861772950, 4.9705523E-07, 6.8280480E-08, -2.7450635E-10, 15.5662654, 4.0579192538, -9548.0947169068, -3.0679233E-04, -4.3192536E-07, 2.0437321E-09, 15.1215543, 14.3803934601, 32304.9118725496, 2.2103334E-05, 3.0940809E-07, -1.4748517E-09, -12.0941511, 8.7259027166, 7737.5900877920, -4.8307078E-06, 6.9513264E-08, -3.8338581E-10, 8.8681426, 9.7124099974, 15019.2270678508, -2.7985829E-04, -1.9203053E-07, 9.5226618E-10, 8.0450400, 0.6687636586, 8399.7091105030, -3.3191993E-05, 3.2017096E-08, -1.5363746E-10, 7.9585542, 12.0679645696, 23347.9184925760, -1.2754553E-04, 5.8380585E-08, -2.3407289E-10, 7.4345550, 6.4565995078, -1847.7052474301, -1.5181570E-04, -1.8213063E-07, 9.1183272E-10, -6.7314363, -4.0265854988, -16133.8556271171, -9.0955337E-05, -2.4484477E-07, 1.1116826E-09, 6.5795750, 16.8104074692, 14323.3509980023, -2.2066770E-04, -1.1756732E-07, 5.4866364E-10, -6.4600721, 1.5847795630, 9061.7681128890, -6.6685176E-05, -4.3335556E-09, -3.4222998E-11, -6.2964773, 4.8837157343, 25300.3984729215, -1.9206388E-04, -1.4849843E-08, 6.0650192E-11, -5.6323538, -0.7707750092, 733.0766881638, -2.1899793E-04, -2.5474467E-07, 1.1521161E-09, -5.3683961, 6.8263720663, 16204.8433027325, -9.7115356E-05, 2.7023515E-08, -1.3414795E-10, -5.3112784, 3.9403341353, 17390.4595376141, 8.5627574E-05, 2.4607756E-07, -1.2205621E-09, -5.0759179, 0.6845236457, 523.5272223331, 2.1367016E-04, 2.5597745E-07, -1.2609955E-09, -4.8396143, -1.6710309265, -7805.1642023920, 6.1357413E-05, 5.5663398E-09, -7.4656459E-11, -4.8057401, 3.5705615768, -662.0890125485, 3.0927234E-05, 3.6923410E-08, -1.7458141E-10, 3.9840545, 8.6945689615, 33419.5404318159, 3.9291696E-04, 7.4628340E-07, -3.5388005E-09, 3.6744619, 19.1659620415, 22652.0424227274, -6.8354947E-05, 1.3284380E-07, -6.3767543E-10, 2.9984815, 20.0662179587, 31190.2833132833, -3.4871029E-04, -1.2746721E-07, 5.8909710E-10, 2.7986413, -2.5281611620, -16971.7070481963, 3.4437664E-04, 2.6526096E-07, -1.2469893E-09, 2.4138774, 17.7106633865, 22861.5918885581, -5.0102304E-04, -3.7787833E-07, 1.7754362E-09, 2.1863132, 5.5132179088, -9757.6441827375, 1.2587576E-04, 7.8796768E-08, -3.6937954E-10, 2.1461692, 13.4801375428, 23766.6709819937, 3.0245868E-04, 5.6971910E-07, -2.7016242E-09, 1.7659832, 11.1677086523, 14809.6776020201, 1.5280981E-04, 3.1869159E-07, -1.4608454E-09, -1.6244212, 7.3137297434, 7318.8375983742, -4.3483492E-04, -4.4182525E-07, 2.0841655E-09, 1.5813036, 5.4387584720, 16552.6081165349, 5.2095955E-04, 7.5618329E-07, -3.5792340E-09, 1.5197528, 16.7359480324, 40633.6032972747, 1.7441609E-04, 5.5981921E-07, -2.6611908E-09, 1.5156341, 1.7023646816, -17876.7861416319, -4.5910508E-04, -6.8233647E-07, 3.2300712E-09, 1.5102092, 5.4977296450, 8399.6847301375, -3.3094061E-05, 3.1973462E-08, -1.5436468E-10, -1.3178223, 9.6261586339, 16275.8309783478, -2.8518605E-04, -1.9079775E-07, 8.4338673E-10, -1.2642739, 11.9817132061, 24604.5224030729, -1.3287330E-04, 5.9613369E-08, -3.4295235E-10, 1.1918723, 22.4217725310, 39518.9747380084, -1.9639754E-04, 1.2294390E-07, -5.9724197E-10, 1.1346110, 14.4235191419, 31676.6099173011, 2.4767216E-05, 3.0879170E-07, -1.4204120E-09, 1.0857810, 8.8552797618, 5852.6842220465, 3.1609367E-06, 6.7664088E-08, -2.2006663E-10, -1.0193852, 7.2392703065, 33629.0898976466, -3.9751134E-05, 2.3556127E-07, -1.1256889E-09, -0.8227141, 11.0814572888, 16066.2815125171, 1.4748204E-04, 3.1992438E-07, -1.5697249E-09, 0.8042238, 3.5274358950, -33.7870573000, 2.8263353E-05, 3.7539802E-08, -2.2902113E-10, 0.8025939, 6.7832463846, 16833.1452579809, -9.9779237E-05, 2.7639907E-08, -1.8858767E-10, -0.7931866, -6.3821400710, -24462.5470518423, -2.4326809E-04, -4.9525589E-07, 2.2980217E-09, -0.7910153, 6.3703481443, -591.1013369332, -1.5714346E-04, -1.8089785E-07, 8.0295327E-10, -0.6674056, 9.1819266386, 24533.5347274576, 5.5197395E-05, 2.7743463E-07, -1.3204870E-09, 0.6502226, 4.1010449356, -10176.3966721553, -3.0412845E-04, -4.3254175E-07, 2.0981718E-09, -0.6388131, 6.2958887075, 25719.1509623392, 2.3794032E-04, 4.9648867E-07, -2.4069012E-09};

    private static final double M21[] = {0.0743000, 11.9537467337, 6480.9861772950, 4.9705523E-07, 6.8280480E-08, -2.7450635E-10, 0.0304300, 8.7259027166, 7737.5900877920, -4.8307078E-06, 6.9513264E-08, -3.8338581E-10, 0.0222900, 12.8540026510, 15019.2270678508, -2.7985829E-04, -1.9203053E-07, 9.5226618E-10, 0.0199900, 15.2095572232, 23347.9184925760, -1.2754553E-04, 5.8380585E-08, -2.3407289E-10, 0.0186900, 9.5981921614, -1847.7052474301, -1.5181570E-04, -1.8213063E-07, 9.1183272E-10, 0.0169600, 7.1681781524, 16133.8556271171, 9.0955337E-05, 2.4484477E-07, -1.1116826E-09, 0.0162300, 1.5847795630, 9061.7681128890, -6.6685176E-05, -4.3335556E-09, -3.4222998E-11, 0.0141900, -0.7707750092, 733.0766881638, -2.1899793E-04, -2.5474467E-07, 1.1521161E-09};

    private static final double M30[] = {385000.5290396, 1.5707963268, 0.0000000000, 0.0000000E+00, 0.0000000E+00, 0.0000000E+00, -20905.3551378, 3.9263508990, 8328.6914247251, 1.5231275E-04, 2.5041111E-07, -1.1863391E-09, -3699.1109330, 9.6121753977, 7214.0628654588, -2.1850087E-04, -1.8646419E-07, 8.7760973E-10, -2955.9675626, 11.9677299699, 15542.7542901840, -6.6188121E-05, 6.3946925E-08, -3.0872935E-10, -569.9251264, 6.2819054713, 16657.3828494503, 3.0462550E-04, 5.0082223E-07, -2.3726782E-09, 246.1584797, 7.2566208254, -1114.6285592663, -3.7081362E-04, -4.3687530E-07, 2.0639488E-09, -204.5861179, 12.0108556517, 14914.4523349355, -6.3524240E-05, 6.3330532E-08, -2.5428962E-10, -170.7330791, 14.3232845422, 23871.4457149091, 8.6124629E-05, 3.1435804E-07, -1.4950684E-09, -152.1378118, 9.6553010794, 6585.7609102104, -2.1583699E-04, -1.8708058E-07, 9.3204945E-10, -129.6202242, -0.8278839272, -7700.3894694766, -1.5497663E-04, -2.4979472E-07, 1.1318993E-09, 108.7427014, 6.7692631483, 7771.3771450920, -3.3094061E-05, 3.1973462E-08, -1.5436468E-10, 104.7552944, 3.8832252173, 8956.9933799736, 1.4964887E-04, 2.5102751E-07, -1.2407788E-09, 79.6605685, 0.6705404095, -8538.2408905558, 2.8035534E-04, 2.6031101E-07, -1.2267725E-09, 48.8883284, 1.5276706450, 628.3019552485, -2.6638815E-06, 6.1639211E-10, -5.4439728E-11, -34.7825237, 20.0091090408, 22756.8171556428, -2.8468899E-04, -1.2251727E-07, 5.6888037E-10, 30.8238599, 11.9246042882, 16171.0562454324, -6.8852003E-05, 6.4563317E-08, -3.6316908E-10, 24.2084985, 9.5690497159, 7842.3648207073, -2.2116475E-04, -1.8584780E-07, 8.2317000E-10, -23.2104305, 8.6374600436, 24986.0742741754, 4.5693825E-04, 7.5123334E-07, -3.5590172E-09, -21.6363439, 17.6535544685, 14428.1257309177, -4.3700174E-04, -3.7292838E-07, 1.7552195E-09, -16.6747239, 6.7261374666, 8399.6791003405, -3.5757942E-05, 3.2589854E-08, -2.0880440E-10, 14.4026890, 4.9010662531, -9443.3199839914, -5.2312637E-04, -6.8728642E-07, 3.2502879E-09, -12.8314035, 14.3664102239, 23243.1437596606, 8.8788511E-05, 3.1374165E-07, -1.4406287E-09, -11.6499478, 22.3646636130, 31085.5085803679, -1.3237624E-04, 1.2789385E-07, -6.1745870E-10, -10.4447578, 16.6788391144, 32200.1371396342, 2.3843738E-04, 5.6476915E-07, -2.6814075E-09, 10.3211071, 8.7119194804, -1324.1780250970, 6.1854469E-05, 7.3846820E-08, -3.4916281E-10, 10.0562033, 7.2997465071, -1742.9305145148, -3.6814974E-04, -4.3749170E-07, 2.1183885E-09, -9.8844667, 12.0539813334, 14286.1503796870, -6.0860358E-05, 6.2714140E-08, -1.9984990E-10, 8.7515625, 6.3563649081, -9652.8694498221, -9.0458282E-05, -1.7656429E-07, 8.3717626E-10, -8.3791067, 4.4137085761, -557.3142796331, -1.8540681E-04, -2.1843765E-07, 1.0319744E-09, -7.0026961, -3.1834384995, -16029.0808942018, -3.0728938E-04, -5.0020584E-07, 2.3182384E-09, 6.3220032, 9.1248177206, 16100.0685698171, 1.1921869E-04, 2.8238458E-07, -1.3407038E-09, 5.7508579, 6.2387797896, 17285.6848046987, 3.0196162E-04, 5.0143862E-07, -2.4271179E-09, -4.9501349, 9.6984267611, 5957.4589549619, -2.1317311E-04, -1.8769697E-07, 9.8648918E-10, -4.4211770, 3.0260949818, -209.5494658307, 4.3266809E-04, 5.1072212E-07, -2.4131116E-09, 4.1311145, 11.0674740526, 7004.5133996281, 2.1416722E-04, 3.2425793E-07, -1.5355019E-09, -3.9579827, 20.0522347225, 22128.5152003943, -2.8202511E-04, -1.2313366E-07, 6.2332010E-10, 3.2582371, 14.8106422192, 14985.4400105508, -2.5159493E-04, -1.5449073E-07, 7.2324505E-10, -3.1483020, 4.8266068163, 16866.9323152810, -1.2804259E-04, -9.8998954E-09, 4.0433461E-11, 2.6164092, 14.2801588604, 24499.7476701576, 8.3460748E-05, 3.1497443E-07, -1.5495082E-09, 2.3536310, 9.5259240342, 8470.6667759558, -2.2382863E-04, -1.8523141E-07, 7.6873027E-10, -2.1171283, -0.8710096090, -7072.0875142282, -1.5764051E-04, -2.4917833E-07, 1.0774596E-09, -1.8970368, 17.6966801503, 13799.8237756692, -4.3433786E-04, -3.7354477E-07, 1.8096592E-09, -1.7385258, 2.0581540038, -8886.0057043583, -3.3771956E-04, -4.6884877E-07, 2.2183135E-09, -1.5713944, 22.4077892948, 30457.2066251194, -1.2971236E-04, 1.2727746E-07, -5.6301898E-10, -1.4225541, 24.7202181853, 39414.2000050930, 1.9936508E-05, 3.7830496E-07, -1.8037978E-09, -1.4189284, 17.1661967915, 23314.1314352759, -9.9282182E-05, 9.5920387E-08, -4.6309403E-10, 1.1655364, 3.8400995356, 9585.2953352221, 1.4698499E-04, 2.5164390E-07, -1.2952185E-09, -1.1169371, 10.9930146158, 33314.7656989005, 6.0925100E-04, 1.0016445E-06, -4.7453563E-09, 1.0656723, 1.4845449633, 1256.6039104970, -5.3277630E-06, 1.2327842E-09, -1.0887946E-10, 1.0586190, 11.9220903668, 8364.7398411275, -2.1850087E-04, -1.8646419E-07, 8.7760973E-10, -0.9333176, 9.0816920389, 16728.3705250656, 1.1655481E-04, 2.8300097E-07, -1.3951435E-09, 0.8624328, 12.4550876470, 6656.7485858257, -4.0390768E-04, -4.0490184E-07, 1.9095841E-09, 0.8512404, 4.3705828944, 70.9876756153, -1.8807069E-04, -2.1782126E-07, 9.7753467E-10, -0.8488018, 16.7219647962, 31571.8351843857, 2.4110126E-04, 5.6415276E-07, -2.6269678E-09, -0.7956264, 3.5134526588, -9095.5551701890, 9.4948529E-05, 4.1873358E-08, -1.9479814E-10};

    private static final double M31[] = {0.5139500, 12.0108556517, 14914.4523349355, -6.3524240E-05, 6.3330532E-08, -2.5428962E-10, 0.3824500, 9.6553010794, 6585.7609102104, -2.1583699E-04, -1.8708058E-07, 9.3204945E-10, 0.3265400, 3.9694765808, 7700.3894694766, 1.5497663E-04, 2.4979472E-07, -1.1318993E-09, 0.2639600, 0.7416325637, 8956.9933799736, 1.4964887E-04, 2.5102751E-07, -1.2407788E-09, 0.1230200, -1.6139220085, 628.3019552485, -2.6638815E-06, 6.1639211E-10, -5.4439728E-11, 0.0775400, 8.7830116346, 16171.0562454324, -6.8852003E-05, 6.4563317E-08, -3.6316908E-10, 0.0606800, 6.4274570623, 7842.3648207073, -2.2116475E-04, -1.8584780E-07, 8.2317000E-10, 0.0497000, 12.0539813334, 14286.1503796870, -6.0860358E-05, 6.2714140E-08, -1.9984990E-10};

    private static final double M1n[] = {3.81034392032, 8.39968473021E+03, -3.31919929753E-05, 3.20170955005E-08, -1.53637455544E-10};

    private static final double nutB[] = {2.1824391966, -33.757045954, 0.0000362262, 3.7340E-08, -2.8793E-10, -171996, -1742, 92025, 89, 3.5069406862, 1256.663930738, 0.0000105845, 6.9813E-10, -2.2815E-10, -13187, -16, 5736, -31, 1.3375032491, 16799.418221925, -0.0000511866, 6.4626E-08, -5.3543E-10, -2274, -2, 977, -5, 4.3648783932, -67.514091907, 0.0000724525, 7.4681E-08, -5.7586E-10, 2062, 2, -895, 5, 0.0431251803, -628.301955171, 0.0000026820, 6.5935E-10, 5.5705E-11, -1426, 34, 54, -1, 2.3555557435, 8328.691425719, 0.0001545547, 2.5033E-07, -1.1863E-09, 712, 1, -7, 0, 3.4638155059, 1884.965885909, 0.0000079025, 3.8785E-11, -2.8386E-10, -517, 12, 224, -6, 5.4382493597, 16833.175267879, -0.0000874129, 2.7285E-08, -2.4750E-10, -386, -4, 200, 0, 3.6930589926, 25128.109647645, 0.0001033681, 3.1496E-07, -1.7218E-09, -301, 0, 129, -1, 3.5500658664, 628.361975567, 0.0000132664, 1.3575E-09, -1.7245E-10, 217, -5, -95, 3};

    private static final double GXC_e[] = {0.016708634, -0.000042037, -0.0000001267};

    private static final double rad = 180 * 3600 / Math.PI;

    private static final double RAD = 180 / Math.PI;

    private static final double J2000 = 2451545;

    private static final double preceB[] = {0, 50287.92262, 111.24406, 0.07699, -0.23479, -0.00178, 0.00018, 0.00001};

    private static final double GXC_p[] = {102.93735 / RAD, 1.71946 / RAD, 0.00046 / RAD};

    private static final double GXC_l[] = {280.4664567 / RAD, 36000.76982779 / RAD, 0.0003032028 / RAD, 1 / 49931000 / RAD, -1 / 153000000 / RAD};

    private static final double GXC_k = 20.49552 / rad;

    private static final double[] dts = {-4000, 108371.7, -13036.80, 392.000, 0.0000, -500, 17201.0, -627.82, 16.170, -0.3413, -150, 12200.6, -346.41, 5.403, -0.1593, 150, 9113.8, -328.13, -1.647, 0.0377, 500, 5707.5, -391.41, 0.915, 0.3145, 900, 2203.4, -283.45, 13.034, -0.1778, 1300, 490.1, -57.35, 2.085, -0.0072, 1600, 120.0, -9.81, -1.532, 0.1403, 1700, 10.2, -0.91, 0.510, -0.0370, 1800, 13.4, -0.72, 0.202, -0.0193, 1830, 7.8, -1.81, 0.416, -0.0247, 1860, 8.3, -0.13, -0.406, 0.0292, 1880, -5.4, 0.32, -0.183, 0.0173, 1900, -2.3, 2.06, 0.169, -0.0135, 1920, 21.2, 1.69, -0.304, 0.0167, 1940, 24.2, 1.22, -0.064, 0.0031, 1960, 33.2, 0.51, 0.231, -0.0109, 1980, 51.0, 1.29, -0.026, 0.0032, 2000, 64.7, -1.66, 5.224, -0.2905, 2150, 279.4, 732.95, 429.579, 0.0158, 6000};

    private double EnnT = 0;
    private double MnnT = 0;

    private double D = 1;

    private class ZD {
        double Lon;
        double Obl;
    }

    /**
     * 生成某年农历二十四节气数组数据
     * Create solar term by year.
     *
     * @param year 某年
     * @return ...
     */
    String[][] buildSolarTerm(int year) {
        String[] tmp = new String[24];
        double jd = 365.2422 * (year - 2000), q;
        int j;
        for (int i = 0; i < tmp.length; i++) {
            j = (i - 5);
            q = angleCal(jd + j * 15.2, j * 15, 0);
            q = q + J2000 + (double) 8 / 24;
            setFromJD(q, true);
            tmp[i] = String.valueOf((int) D);
        }
        return DataUtils.arraysConvert(tmp, 12, 2);
    }

    private void setFromJD(double jd, boolean UTC) {
        if (UTC)
            jd -= this.deltaT2(jd - J2000);
        jd += 0.5;

        double A = int2(jd);
        double D;

        if (A > 2299161) {
            D = int2((A - 1867216.25) / 36524.25);
            A += 1 + D - int2(D / 4);
        }
        A += 1524;
        double y = int2((A - 122.1) / 365.25);
        D = A - int2(365.25 * y);
        double m = int2(D / 30.6001);
        this.D = D - int2(m * 30.6001);
        y -= 4716;
        m--;
        if (m > 12)
            m -= 12;
        if (m <= 2)
            //noinspection UnusedAssignment
            y++;
    }

    private double int2(double v) {
        v = Math.floor(v);
        if (v < 0)
            return v + 1;
        return v;
    }

    private double deltaT2(double jd) {
        return this.deltaT(jd / 365.2425 + 2000) / 86400.0;
    }

    private double deltaT(double y) {
        int i;
        for (i = 0; i < 100; i += 5)
            if (y < dts[i + 5] || i == 95)
                break;
        double t1 = (y - dts[i]) / (dts[i + 5] - dts[i]) * 10;
        double t2 = t1 * t1;
        double t3 = t2 * t1;
        return dts[i + 1] + dts[i + 2] * t1 + dts[i + 3] * t2 + dts[i + 4] * t3;
    }

    private double angleCal(double t1, double jiao, int lx) {
        double t2 = t1, t = 0, v;
        if (lx == 0)
            t2 += 360;
        else
            t2 += 25;
        jiao *= Math.PI / 180;
        double v1 = jiaoCai(lx, t1, jiao);
        double v2 = jiaoCai(lx, t2, jiao);
        if (v1 < v2)
            v2 -= 2 * Math.PI;
        double k = 1, k2;
        for (int i = 0; i < 10; i++) {
            k2 = (v2 - v1) / (t2 - t1);
            if (Math.abs(k2) > 1e-15)
                k = k2;
            t = t1 - v1 / k;
            v = jiaoCai(lx, t, jiao);
            if (v > 1)
                v -= 2 * Math.PI;
            if (Math.abs(v) < 1e-8)
                break;
            t1 = t2;
            v1 = v2;
            t2 = t;
            v2 = v;
        }
        return t;
    }

    private double jiaoCai(int lx, double t, double jiao) {
        double[] sun = earCal(t);
        sun[0] += Math.PI;
        sun[1] = -sun[1];
        addGxc(t, sun);
        if (lx == 0) {
            ZD d = nutation(t);
            sun[0] += d.Lon;
            return rad2mrad(jiao - sun[0]);
        }
        double[] moon = moonCal(t);
        return rad2mrad(jiao - (moon[0] - sun[0]));
    }

    private double[] moonCal(double jd) {
        MnnT = jd / 36525;
        double t1 = MnnT, t2 = t1 * t1, t3 = t2 * t1, t4 = t3 * t1;
        double[] llr = new double[3];
        llr[0] = (Mnn(M10) + Mnn(M11) * t1 + Mnn(M12) * t2) / rad;
        llr[1] = (Mnn(M20) + Mnn(M21) * t1) / rad;
        llr[2] = (Mnn(M30) + Mnn(M31) * t1) * 0.999999949827;
        llr[0] = llr[0] + M1n[0] + M1n[1] * t1 + M1n[2] * t2 + M1n[3] * t3 + M1n[4] * t4;
        llr[0] = rad2mrad(llr[0]);
        addPrece(jd, llr);
        return llr;
    }

    private void addPrece(double jd, double[] zb) {
        int i;
        double t = 1, v = 0, t1 = jd / 365250;
        for (i = 1; i < 8; i++) {
            t *= t1;
            v += preceB[i] * t;
        }
        zb[0] = rad2mrad(zb[0] + (v + 2.9965 * t1) / rad);
    }

    private double Mnn(double[] F) {
        double v = 0, t1 = MnnT, t2 = t1 * t1, t3 = t2 * t1, t4 = t3 * t1;
        for (int i = 0; i < F.length; i += 6)
            v += F[i] * Math.sin(F[i + 1] + t1 * F[i + 2] + t2 * F[i + 3] + t3 * F[i + 4] + t4 * F[i + 5]);
        return v;
    }

    private ZD nutation(double t) {
        ZD d = new ZD();
        d.Lon = 0;
        d.Obl = 0;
        t /= 36525;
        double c, t1 = t, t2 = t1 * t1, t3 = t2 * t1, t4 = t3 * t1;
        for (int i = 0; i < nutB.length; i += 9) {
            c = nutB[i] + nutB[i + 1] * t1 + nutB[i + 2] * t2 + nutB[i + 3] * t3 + nutB[i + 4] * t4;
            d.Lon += (nutB[i + 5] + nutB[i + 6] * t / 10) * Math.sin(c);
            d.Obl += (nutB[i + 7] + nutB[i + 8] * t / 10) * Math.cos(c);
        }
        d.Lon /= rad * 10000;
        d.Obl /= rad * 10000;
        return d;
    }

    private void addGxc(double t, double[] zb) {
        double t1 = t / 36525;
        double t2 = t1 * t1;
        double t3 = t2 * t1;
        double t4 = t3 * t1;
        double L = GXC_l[0] + GXC_l[1] * t1 + GXC_l[2] * t2 + GXC_l[3] * t3 + GXC_l[4] * t4;
        double p = GXC_p[0] + GXC_p[1] * t1 + GXC_p[2] * t2;
        double e = GXC_e[0] + GXC_e[1] * t1 + GXC_e[2] * t2;
        double dL = L - zb[0], dP = p - zb[0];
        zb[0] -= GXC_k * (Math.cos(dL) - e * Math.cos(dP)) / Math.cos(zb[1]);
        zb[1] -= GXC_k * Math.sin(zb[1]) * (Math.sin(dL) - e * Math.sin(dP));
        zb[0] = rad2mrad(zb[0]);
    }

    private double[] earCal(double jd) {
        EnnT = jd / 365250;
        double llr[] = new double[3];
        double t1 = EnnT, t2 = t1 * t1, t3 = t2 * t1, t4 = t3 * t1, t5 = t4 * t1;
        llr[0] = Enn(E10) + Enn(E11) * t1 + Enn(E12) * t2 + Enn(E13) * t3 + Enn(E14) * t4 + Enn(E15) * t5;
        llr[1] = Enn(E20) + Enn(E21) * t1;
        llr[2] = Enn(E30) + Enn(E31) * t1 + Enn(E32) * t2 + Enn(E33) * t3;
        llr[0] = rad2mrad(llr[0]);
        return llr;
    }

    private double rad2mrad(double v) {
        v = v % (2 * Math.PI);
        if (v < 0)
            return v + 2 * Math.PI;
        return v;
    }

    private double Enn(double[] F) {
        double v = 0;
        for (int i = 0; i < F.length; i += 3)
            v += F[i] * Math.cos(F[i + 1] + EnnT * F[i + 2]);
        return v;
    }
}


package common.com.commoncalendar.Bean.calendars;

import android.content.Context;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import common.com.commoncalendar.Adapter.AllUseAdapter;
import common.com.commoncalendar.Holder.AllUseViewHolder;
import common.com.commoncalendar.R;
import common.com.commoncalendar.Utils.CalendarManagerUtils;
import common.com.commoncalendar.Utils.MeasureUtil;
import common.com.commoncalendar.View.MyGridView;

/**
 * Created by zhq_zhao on 2017/12/21.
 */
public class VerticalSlideCalendar {
    //数据源嵌套在内部的实体
    List<Object> innerlist = new ArrayList<>();
    //内部嵌套的数据实体
    private CalendarManagerUtils instance;
    private List<Object> threeArrList;
    private LunarCalendar lunarCalendar;
    private ArrayList arryLunarCalendarList;
    //记录第一次点时间的位置集合
    Map<String, Integer> selectStart = new HashMap<>();
    //记录第二次点击选择时间的位置集合
    Map<String, Integer> selectEnd = new HashMap<>();
    private int clickNumber = 1;//记录点击次数
    private OutAdapter outAdapter;
    private Context context;

    public VerticalSlideCalendar(Context context) {
        this.context = context;
        for (int i = 0; i < 36; i++) {
            innerlist.add(i);
        }
        if (instance == null) {
            instance = CalendarManagerUtils.getInstance();

        }
        //获取最近三年数据信息集合
        instance.setThreeYearArralistDatas();
        threeArrList = instance.getThreeArrList();
        //获取农历日历信息
        lunarCalendar = new LunarCalendar();
        selectStart.clear();
        selectEnd.clear();


    }

    public View getCalendarView(Context context, int layoutId) {
        View view = View.inflate(context, layoutId, null);
        initview(view);
        return view;
    }

    /**
     * 获取农历日历信息
     *
     * @param year
     * @param month
     */
    private void getLunarCalendar(int year, int month) {

        //获取农历数据
        String[][] strings = lunarCalendar.buildMonthFestival(year, month);
        arryLunarCalendarList = new ArrayList();
        for (int i = 0; i < strings.length; i++) {
            String[] string = strings[i];
            for (int j = 0; j < string.length; j++) {
                String s = string[j];
                arryLunarCalendarList.add(s);
            }
        }
    }


    /**
     * innerlist:三年的月份长度36个月
     */
    private void initview(View view) {
        final ListView listview = (ListView) view.findViewById(R.id.list_item);
        //获取当前时间
        instance.initCalendarDate();
        int year = instance.getmYear();
        int day = instance.getmDay();
        int month = instance.getmMonth();
        if (outAdapter == null) {
            outAdapter = new OutAdapter(context, innerlist, R.layout.list_items, year, month, day);

        }
        listview.setAdapter(outAdapter);

        //定位到当前月份数据
        showCurrentMonth(year, month, listview, threeArrList);

    }

    public class OutAdapter extends AllUseAdapter {
        private final int year;
        private final int month;
        private final int day;

        public OutAdapter(Context context, List list, int itemlayoutId, int year, int month, int day) {
            super(context, list, itemlayoutId);
            this.year = year;
            this.month = month;
            this.day = day;
        }

        @Override
        protected void convert(AllUseViewHolder viewHolder, Object item, final int fatherposition) {
            final TextView tv_year = viewHolder.getView(R.id.tv_year);
            final TextView tv_month = viewHolder.getView(R.id.tv_month);
            //外面一层控制年份和月份
            MyGridView item_grideview = viewHolder.getView(R.id.item_gridview);
            item_grideview.setAdapter(new AllUseAdapter<Object>(context, threeArrList, R.layout.item_gride) {


                @Override
                protected void convert(final AllUseViewHolder viewHolder, Object item, final int position) {

                    //里面一层控制当前的天数
                    final TextView textView = viewHolder.getView(R.id.tv_date);
                    final TextView tv_lunarCalendar = viewHolder.getView(R.id.tv_lunarCalendar);
                    final LinearLayout mll_select = viewHolder.getView(R.id.ll_select);
                    Map o = (Map) threeArrList.get(fatherposition);
                    String mdayofWeek = String.valueOf(o.get("mdayofWeek"));
                    String mMonth = String.valueOf(o.get("mMonth"));
                    String mYear = String.valueOf(o.get("mYear"));
                    String maxNum = String.valueOf(o.get("maxNum"));
                    tv_month.setText(mMonth);
                    tv_year.setText(mYear);

                    //获取农历信息集合
                    getLunarCalendar(Integer.parseInt(mYear), Integer.parseInt(mMonth));
                    //农历信息展示
                    setLurCalendarShows(position, tv_lunarCalendar, mdayofWeek, maxNum);
                    //设置阳历信息
                    setCalendarDayInfos(position, textView, mdayofWeek, maxNum);
                    //如果是今日以前的数据显示灰色
                    showPreDataBackGroundGray(year, month, day, textView, tv_year, tv_month, tv_lunarCalendar, mll_select);
                    if (textView.getText().toString().equals("0")) {
                        textView.setVisibility(View.GONE);
                    } else {
                        textView.setVisibility(View.VISIBLE);
                    }
                    textView.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
//                            Toast.makeText(context, tv_year.getText().toString() + tv_month.getText().toString() + textView.getText().toString(), Toast.LENGTH_SHORT).show();

                            outAdapter.notifyDataSetChanged();
                            if (clickNumber % 2 == 0) {//偶数说明是结尾
                                if (selectEnd.size() == 0) {//记录第二次点击
                                    selectEnd.put("end_year", Integer.parseInt(tv_year.getText().toString()));
                                    selectEnd.put("end_month", Integer.parseInt(tv_month.getText().toString()));
                                    selectEnd.put("end_day", Integer.parseInt(textView.getText().toString()));
                                } else if (selectEnd.size() == 3) {
                                    selectEnd.clear();
                                    selectEnd.put("end_year", Integer.parseInt(tv_year.getText().toString()));
                                    selectEnd.put("end_month", Integer.parseInt(tv_month.getText().toString()));
                                    selectEnd.put("end_day", Integer.parseInt(textView.getText().toString()));

                                }
                                if(mOnTwoClickListener!=null){
                                    int startRange = 0;
                                    int endRange = 0;
                                    //拿到第一次点击的年月日
                                    Integer start_year = selectStart.get("start_year");
                                    Integer start_month = selectStart.get("start_month");
                                    Integer start_day = selectStart.get("start_day");
                                    //拿到第二次点击的年月日
                                    Integer end_year = selectEnd.get("end_year");
                                    Integer end_month = selectEnd.get("end_month");
                                    Integer end_day = selectEnd.get("end_day");

                                    if (start_month < 10) {
                                        if (start_day < 10) {
                                            startRange = Integer.parseInt(start_year + "0" + start_month + "0" + start_day);
                                        } else {
                                            startRange = Integer.parseInt(start_year + "0" + start_month + "" + start_day);
                                        }
                                    } else {
                                        if (start_day < 10) {
                                            startRange = Integer.parseInt(start_year + "" + start_month + "0" + start_day);
                                        } else {
                                            startRange = Integer.parseInt(start_year + "" + start_month + "" + start_day);
                                        }
                                    }
                                    if (end_month < 10) {
                                        if (end_day < 10) {
                                            endRange = Integer.parseInt(end_year + "0" + end_month + "0" + end_day);
                                        } else {
                                            endRange = Integer.parseInt(end_year + "0" + end_month + "" + end_day);
                                        }
                                    } else {
                                        if (start_day < 10) {
                                            endRange = Integer.parseInt(end_year + "" + end_month + "0" + end_day);
                                        } else {
                                            endRange = Integer.parseInt(end_year + "" + end_month + "" + end_day);
                                        }
                                    }
                                    mOnTwoClickListener.setOnTwoClickListener(String.valueOf(startRange),String.valueOf(endRange));
                                }

                            } else {//奇数说明是开头
                                if (selectStart.size() == 0) {//记录第一次已经点击了
                                    selectStart.put("start_year", Integer.parseInt(tv_year.getText().toString()));
                                    selectStart.put("start_month", Integer.parseInt(tv_month.getText().toString()));
                                    selectStart.put("start_day", Integer.parseInt(textView.getText().toString()));
                                } else if (selectStart.size() == 3) {
                                    selectStart.clear();
                                    selectStart.put("start_year", Integer.parseInt(tv_year.getText().toString()));
                                    selectStart.put("start_month", Integer.parseInt(tv_month.getText().toString()));
                                    selectStart.put("start_day", Integer.parseInt(textView.getText().toString()));
                                    if (selectEnd.size() == 3) {
                                        selectEnd.clear();
                                    }

                                }
                            }

                            clickNumber = clickNumber + 1;
                        }
                    });


                    //判断连续点击逻辑
                    if (selectStart.size() > 0 && selectEnd.size() > 0) {
                        int startRange = 0;
                        int endRange = 0;
                        int selectRange = 0;
                        //拿到第一次点击的年月日
                        Integer start_year = selectStart.get("start_year");
                        Integer start_month = selectStart.get("start_month");
                        Integer start_day = selectStart.get("start_day");
                        //拿到第二次点击的年月日
                        Integer end_year = selectEnd.get("end_year");
                        Integer end_month = selectEnd.get("end_month");
                        Integer end_day = selectEnd.get("end_day");

                        if (start_month < 10) {
                            if (start_day < 10) {
                                startRange = Integer.parseInt(start_year + "0" + start_month + "0" + start_day);
                            } else {
                                startRange = Integer.parseInt(start_year + "0" + start_month + "" + start_day);
                            }
                        } else {
                            if (start_day < 10) {
                                startRange = Integer.parseInt(start_year + "" + start_month + "0" + start_day);
                            } else {
                                startRange = Integer.parseInt(start_year + "" + start_month + "" + start_day);
                            }
                        }
                        if (end_month < 10) {
                            if (end_day < 10) {
                                endRange = Integer.parseInt(end_year + "0" + end_month + "0" + end_day);
                            } else {
                                endRange = Integer.parseInt(end_year + "0" + end_month + "" + end_day);
                            }
                        } else {
                            if (start_day < 10) {
                                endRange = Integer.parseInt(end_year + "" + end_month + "0" + end_day);
                            } else {
                                endRange = Integer.parseInt(end_year + "" + end_month + "" + end_day);
                            }
                        }
                        if (Integer.parseInt(tv_month.getText().toString()) < 10) {
                            if (Integer.parseInt(textView.getText().toString()) < 10) {
                                selectRange = Integer.parseInt(Integer.parseInt(tv_year.getText().toString()) + "0" + Integer.parseInt(tv_month.getText().toString()) + "0" + Integer.parseInt(textView.getText().toString()));
                            } else {
                                selectRange = Integer.parseInt(Integer.parseInt(tv_year.getText().toString()) + "0" + Integer.parseInt(tv_month.getText().toString()) + "" + Integer.parseInt(textView.getText().toString()));
                            }
                        } else {
                            if (Integer.parseInt(textView.getText().toString()) < 10) {
                                selectRange = Integer.parseInt(Integer.parseInt(tv_year.getText().toString()) + "" + Integer.parseInt(tv_month.getText().toString()) + "0" + Integer.parseInt(textView.getText().toString()));
                            } else {
                                selectRange = Integer.parseInt(Integer.parseInt(tv_year.getText().toString()) + "" + Integer.parseInt(tv_month.getText().toString()) + "" + Integer.parseInt(textView.getText().toString()));
                            }
                        }

                        if (selectRange >= startRange && selectRange <= endRange) {
                            if (textView.getText().toString().equals("0")) {
                                viewHolder.setBackground(R.id.ll_select, R.color.transparent);
                            } else {

                                viewHolder.setBackground(R.id.ll_select, R.color.btn_press_color);
                            }
                        } else {
                            viewHolder.setBackground(R.id.ll_select, R.color.transparent);
                        }


                    } else if (selectStart.size() > 0 && selectEnd.size() == 0) {//第一次点击
                        //拿到第一次点击的年月日
                        Integer start_year = selectStart.get("start_year");
                        Integer start_month = selectStart.get("start_month");
                        Integer start_day = selectStart.get("start_day");

                        if (Integer.parseInt(tv_year.getText().toString()) == start_year && Integer.parseInt(tv_month.getText().toString()) == start_month && Integer.parseInt(textView.getText().toString()) == start_day) {
                            viewHolder.setBackground(R.id.ll_select, R.color.btn_press_color);

                        } else {
                            viewHolder.setBackground(R.id.ll_select, R.color.transparent);
                        }

                    }

                }
            });
        }


    }


    /**
     * 农历信息展示
     *
     * @param position
     * @param tv_lunarCalendar
     * @param mdayofWeek
     * @param maxNum
     */
    private void setLurCalendarShows(int position, TextView tv_lunarCalendar, String mdayofWeek, String maxNum) {
        if (position < 42) {
            if (mdayofWeek.equals("1")) {
                if (maxNum.equals("28")) {
                    tv_lunarCalendar.setText(arryLunarCalendarList.get(position).toString());
                } else if (maxNum.equals("29")) {
                    tv_lunarCalendar.setText(arryLunarCalendarList.get(position).toString());
                } else if (maxNum.equals("30")) {
                    tv_lunarCalendar.setText(arryLunarCalendarList.get(position).toString());
                } else if (maxNum.equals("31")) {
                    tv_lunarCalendar.setText(arryLunarCalendarList.get(position).toString());
                }
            } else if (mdayofWeek.equals("2")) {
                if (maxNum.equals("28")) {
                    tv_lunarCalendar.setText(arryLunarCalendarList.get(position).toString());
                } else if (maxNum.equals("29")) {
                    tv_lunarCalendar.setText(arryLunarCalendarList.get(position).toString());
                } else if (maxNum.equals("30")) {
                    tv_lunarCalendar.setText(arryLunarCalendarList.get(position).toString());
                } else if (maxNum.equals("31")) {
                    tv_lunarCalendar.setText(arryLunarCalendarList.get(position).toString());
                }
            } else if (mdayofWeek.equals("3")) {
                if (maxNum.equals("28")) {
                    tv_lunarCalendar.setText(arryLunarCalendarList.get(position).toString());
                } else if (maxNum.equals("29")) {
                    tv_lunarCalendar.setText(arryLunarCalendarList.get(position).toString());
                } else if (maxNum.equals("30")) {
                    tv_lunarCalendar.setText(arryLunarCalendarList.get(position).toString());
                } else if (maxNum.equals("31")) {
                    tv_lunarCalendar.setText(arryLunarCalendarList.get(position).toString());
                }
            } else if (mdayofWeek.equals("4")) {
                if (maxNum.equals("28")) {
                    tv_lunarCalendar.setText(arryLunarCalendarList.get(position).toString());
                } else if (maxNum.equals("29")) {
                    tv_lunarCalendar.setText(arryLunarCalendarList.get(position).toString());
                } else if (maxNum.equals("30")) {
                    tv_lunarCalendar.setText(arryLunarCalendarList.get(position).toString());
                } else if (maxNum.equals("31")) {
                    tv_lunarCalendar.setText(arryLunarCalendarList.get(position).toString());
                }
            } else if (mdayofWeek.equals("5")) {
                if (maxNum.equals("28")) {
                    tv_lunarCalendar.setText(arryLunarCalendarList.get(position).toString());
                } else if (maxNum.equals("29")) {
                    tv_lunarCalendar.setText(arryLunarCalendarList.get(position).toString());
                } else if (maxNum.equals("30")) {
                    tv_lunarCalendar.setText(arryLunarCalendarList.get(position).toString());
                } else if (maxNum.equals("31")) {
                    tv_lunarCalendar.setText(arryLunarCalendarList.get(position).toString());

                }
            } else if (mdayofWeek.equals("6")) {

                if (maxNum.equals("28")) {
                    tv_lunarCalendar.setText(arryLunarCalendarList.get(position).toString());
                } else if (maxNum.equals("29")) {
                    tv_lunarCalendar.setText(arryLunarCalendarList.get(position).toString());
                } else if (maxNum.equals("30")) {
                    tv_lunarCalendar.setText(arryLunarCalendarList.get(position).toString());
                } else if (maxNum.equals("31")) {
                    tv_lunarCalendar.setText(arryLunarCalendarList.get(position).toString());


                }
            } else if (mdayofWeek.equals("7")) {
                if (maxNum.equals("28")) {
                    tv_lunarCalendar.setText(arryLunarCalendarList.get(position).toString());
                } else if (maxNum.equals("29")) {
                    tv_lunarCalendar.setText(arryLunarCalendarList.get(position).toString());
                } else if (maxNum.equals("30")) {
                    tv_lunarCalendar.setText(arryLunarCalendarList.get(position).toString());
                } else if (maxNum.equals("31")) {
                    tv_lunarCalendar.setText(arryLunarCalendarList.get(position).toString());
                }
            }
        }

    }

    /**
     * 设置阳历信息
     *
     * @param position
     * @param textView
     * @param mdayofWeek
     * @param maxNum
     */
    private void setCalendarDayInfos(int position, TextView textView, String mdayofWeek, String maxNum) {

        //星期天到星期六依次对应1-7
        if (mdayofWeek.equals("1")) {
            if (maxNum.equals("28")) {
                if (position <= 27) {
                    textView.setText(String.valueOf(position + 1));

                }

            } else if (maxNum.equals("29")) {
                if (position <= 28) {
                    textView.setText(String.valueOf(position + 1));
                }
            } else if (maxNum.equals("30")) {
                if (position <= 29) {
                    textView.setText(String.valueOf(position + 1));
                }
            } else if (maxNum.equals("31")) {
                if (position <= 30) {
                    textView.setText(String.valueOf(position + 1));
                }
            }

        } else if (mdayofWeek.equals("2")) {
            if (maxNum.equals("28")) {
                if (position <= 28 && position >= 1) {
                    textView.setText(String.valueOf(position));
                }
            } else if (maxNum.equals("29")) {
                if (position <= 29 && position >= 1) {
                    textView.setText(String.valueOf(position));
                }
            } else if (maxNum.equals("30")) {
                if (position <= 30 && position >= 1) {
                    textView.setText(String.valueOf(position));
                }
            } else if (maxNum.equals("31")) {
                if (position <= 31 && position >= 1) {
                    textView.setText(String.valueOf(position));
                }
            }
        } else if (mdayofWeek.equals("3")) {
            if (maxNum.equals("28")) {
                if (position < 30 && position >= 2) {
                    textView.setText(String.valueOf(position - 1));
                }
            } else if (maxNum.equals("29")) {
                if (position < 31 && position >= 2) {
                    textView.setText(String.valueOf(position - 1));
                }
            } else if (maxNum.equals("30")) {
                if (position < 32 && position >= 2) {
                    textView.setText(String.valueOf(position - 1));
                }
            } else if (maxNum.equals("31")) {
                if (position < 33 && position >= 2) {
                    textView.setText(String.valueOf(position - 1));
                }
            }
        } else if (mdayofWeek.equals("4")) {
            if (maxNum.equals("28")) {
                if (position < 31 && position >= 3) {
                    textView.setText(String.valueOf(position - 2));
                }
            } else if (maxNum.equals("29")) {
                if (position < 32 && position >= 3) {
                    textView.setText(String.valueOf(position - 2));
                }
            } else if (maxNum.equals("30")) {
                if (position < 33 && position >= 3) {
                    textView.setText(String.valueOf(position - 2));
                }
            } else if (maxNum.equals("31")) {
                if (position < 34 && position >= 3) {
                    textView.setText(String.valueOf(position - 2));
                }
            }
        } else if (mdayofWeek.equals("5")) {
            if (maxNum.equals("28")) {
                if (position < 32 && position >= 4) {
                    textView.setText(String.valueOf(position - 3));
                }
            } else if (maxNum.equals("29")) {
                if (position < 33 && position >= 4) {
                    textView.setText(String.valueOf(position - 3));
                }
            } else if (maxNum.equals("30")) {
                if (position < 34 && position >= 4) {
                    textView.setText(String.valueOf(position - 3));
                }
            } else if (maxNum.equals("31")) {
                if (position < 35 && position >= 4) {
                    textView.setText(String.valueOf(position - 3));
                }
            }
        } else if (mdayofWeek.equals("6")) {
            if (maxNum.equals("28")) {
                if (position < 33 && position >= 5) {
                    textView.setText(String.valueOf(position - 4));
                }
            } else if (maxNum.equals("29")) {
                if (position < 34 && position >= 5) {
                    textView.setText(String.valueOf(position - 4));
                }
            } else if (maxNum.equals("30")) {
                if (position < 35 && position >= 5) {
                    textView.setText(String.valueOf(position - 4));
                }
            } else if (maxNum.equals("31")) {
                if (position < 36 && position >= 5) {
                    textView.setText(String.valueOf(position - 4));
                }
            }
        } else if (mdayofWeek.equals("7")) {

            if (maxNum.equals("28")) {
                if (position < 34 && position >= 6) {
                    textView.setText(String.valueOf(position - 5));
                }
            } else if (maxNum.equals("29")) {
                if (position < 35 && position >= 6) {
                    textView.setText(String.valueOf(position - 5));
                }
            } else if (maxNum.equals("30")) {
                if (position < 36 && position >= 6) {
                    textView.setText(String.valueOf(position - 5));
                }
            } else if (maxNum.equals("31")) {
                if (position < 37 && position >= 6) {
                    textView.setText(String.valueOf(position - 5));

                }
            }
        }
    }

    /**
     * 定位到当前月份
     *
     * @param year
     * @param month
     * @param listview
     * @param threeArrList
     */
    private void showCurrentMonth(int year, int month, ListView listview, List<Object> threeArrList) {
        for (int i = 0; i < 36; i++) {
            Map map = (Map) threeArrList.get(i);
            String cMonth = String.valueOf(map.get("mMonth"));
            String cYear = String.valueOf(map.get("mYear"));
            if (year == Integer.parseInt(cYear) && month == Integer.parseInt(cMonth)) {
                listview.setSelection(i);

            }
        }
    }

    /**
     * 如果是今日以前的数据显示灰色
     * 规定灰色的不能点击
     *
     * @param year
     * @param month
     * @param day
     * @param mTextView
     * @param tv_year
     * @param tv_month
     */
    private void showPreDataBackGroundGray(int year, int month, int day, TextView mTextView, TextView tv_year, TextView tv_month, TextView tv_lunarCalendar, LinearLayout mll_select) {
        if (!mTextView.getText().toString().equals("") && mTextView.getText().toString() != null) {
            if (year > Integer.parseInt(tv_year.getText().toString())) {//去年显示灰色
                mTextView.setTextColor(context.getResources().getColor(R.color.gray));
                mTextView.setEnabled(false);
            } else if (year == Integer.parseInt(tv_year.getText().toString()) && month > Integer.parseInt(tv_month.getText().toString())) {//今年当月以前的月份日期显示灰色
                mTextView.setTextColor(context.getResources().getColor(R.color.gray));
                mTextView.setEnabled(false);
            } else if (year == Integer.parseInt(tv_year.getText().toString()) && month == Integer.parseInt(tv_month.getText().toString()) && day
                    > Integer.parseInt(mTextView.getText().toString())) {//今年当月以前的天数显示灰色
                mTextView.setTextColor(context.getResources().getColor(R.color.gray));
                mTextView.setEnabled(false);
            } else if (year == Integer.parseInt(tv_year.getText().toString()) && month == Integer.parseInt(tv_month.getText().toString()) && day
                    == Integer.parseInt(mTextView.getText().toString())) {//今天
                tv_lunarCalendar.setTextColor(context.getResources().getColor(R.color.red));
                tv_lunarCalendar.setText("今天");
                tv_lunarCalendar.setTextSize(MeasureUtil.dp2px(context, 12));
                mll_select.setBackgroundColor(context.getResources().getColor(R.color.login_forget_pwd));

            }

        } else {
            mTextView.setTextColor(context.getResources().getColor(R.color.gray));
            mTextView.setEnabled(false);
        }
    }

    private OnTwoClickListener mOnTwoClickListener;

    public interface OnTwoClickListener {
        void setOnTwoClickListener(String startDate, String endDate);
    }

    public void setmOnTwoClickListener(OnTwoClickListener mOnTwoClickListener) {
        this.mOnTwoClickListener = mOnTwoClickListener;
    }
}


package common.com.commoncalendar.Holder;

import android.content.Context;
import android.graphics.Bitmap;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

/**
 * Created by zhq_zhao on 2017/12/14.
 */
public class AllUseViewHolder {
    private final SparseArray<View> viewSparseArray;
    private View mConvertView;//创建复用的布局对象
    private int mPosition;
    public AllUseViewHolder(Context context, ViewGroup viewGroup, int layoutId, int position) {
        //用SparseArray存储view
        this.viewSparseArray = new SparseArray<>();
        this.mPosition=position;
        //创建具体的view布局
        mConvertView = LayoutInflater.from(context).inflate(layoutId, viewGroup, false);
        //利用复用布局对象和viewholder里面的控件进行绑定
        mConvertView.setTag(this);//this指的就是viewholder对象里面控件id的绑定
    }
    /**
     * 拿到viewholder对象可以单选多线颜色状态等等变化的方法封装
     *
     * @param context
     * @param convertView
     * @param viewGroup
     * @param layoutId
     * @param postion
     * @return
     */
    public static AllUseViewHolder get(Context context, View convertView, ViewGroup viewGroup, int layoutId, int postion) {
        if (convertView == null) {
            return new AllUseViewHolder(context, viewGroup, layoutId, postion);
        } else {//说明布局对象已存在,直接取出来viewholder控件绑定信息的对象
            return (AllUseViewHolder) convertView.getTag();
        }
    }
    /**
     * 封装一个方法为外面类调用拿到view控件id去做任何操作,通过控件的Id获取对于的控件,如果没有则加入viewSparseArray
     *
     * @param viewId
     * @param <T>
     * @return
     */
    public <T extends View> T getView(int viewId) {
        //首先判断当前控件是否已经存入
        View view = viewSparseArray.get(viewId);
        if (view == null) {//说明没有存入进去
            //先找到控件id
            view = mConvertView.findViewById(viewId);
            viewSparseArray.put(viewId, view);//viewid是控件的id,item里面控件id都是不一样的所以可以当做key来使用
        }
        //说明已经存在,直接拿出来,这个也是viewholder的好处,省去好多重复去查询控件id次数
        return (T) view;//返回控件id的引用,拿到引用可以设置颜色状态文字等等
    }
    public View getConvertView() {
        return mConvertView;
    }
    //一般操作都是textview,imageview,button,checkbox等
    /**
     * 为TextView设置字符串
     *
     * @param viewid
     * @param text
     * @return
     */
    public AllUseViewHolder setText(int viewid, Object text) {
        TextView textView = getView(viewid);
        textView.setText(""+text);
        return this;
    }

    /**
     * 为ImageView设置图片
     *
     * @param viewId
     * @param drawableId
     * @return
     */
    public AllUseViewHolder setImageResource(int viewId, int drawableId) {
        ImageView view = getView(viewId);
        view.setImageResource(drawableId);
        return this;
    }
    /**
     * 为ImageView设置图片
     *
     * @param viewId
     * @param bm
     * @return
     */
    public AllUseViewHolder setImageBitmap(int viewId, Bitmap bm) {
        ImageView view = getView(viewId);
        view.setImageBitmap(bm);
        return this;
    }


    /**隐藏文字
     *
     * @param viewId
     */
    public void setHideText(int viewId){
        TextView textView=getView(viewId);
        textView.setVisibility(View.GONE);
    }

    /**显示文字
     *
     * @param viewId
     */
    public void setShowText(int viewId){
        TextView textView=getView(viewId);
        textView.setVisibility(View.VISIBLE);
    }
    /**隐藏图片
     *
     * @param viewId
     */
    public void setHidePicture(int viewId){
        ImageView view = getView(viewId);
        view.setVisibility(View.GONE);
    }

    /**显示图片
     *
     * @param viewId
     */
    public void showPicture(int viewId){
        ImageView view = getView(viewId);
        view.setVisibility(View.VISIBLE);
    }
    /**
     * 为ImageView设置图片
     *
     * @param viewId
     * @param bm
     * @return
     */
    public AllUseViewHolder setImageBitmapTag(int viewId, Bitmap bm) {
        ImageView view = getView(viewId);
        view.setImageBitmap(bm);
        return this;
    }
    /**
     * 设置圆形图片
     *
     * @param viewId
     * @param url
     * @return
     */
    public AllUseViewHolder setImageByUrl(int viewId, String url) {
        //   Glide.with(MyApplication.context).load(url).diskCacheStrategy(DiskCacheStrategy.ALL).error(R.mipmap.user_default).into((ImageView) getView(viewId));
      //  Glide.with(MyApplication.context).load(url).transform(new GlideCircleTransform(MyApplication.context)).into((ImageView) getView(viewId));
        return this;
    }

    /**设置正常的图片
     *
     * @param viewId
     * @param url
     * @return
     */
    public AllUseViewHolder setImageByUrlOfNormol(int viewId, String url) {
        // Glide.with(MyApplication.context).load(detail.get(position).getPictureUrl()).transform(new CenterCrop(MyApplication.context),new GlideRoundTransform(MyApplication.context,5)).into(holder.iv_imageview_talls);
        //Glide.with(MyApplication.context).load(url).into((ImageView) getView(viewId));
        return this;
    }
    public AllUseViewHolder setBackground(int viewId, int backgroundRes) {
        View view = getView(viewId);
        view.setBackgroundResource(backgroundRes);
        return this;
    }
    public int getPosition() {
        return mPosition ;

    }

}


package common.com.commoncalendar.Utils;

import android.util.Log;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;


/**
 * Created by zhq_zhao on 2017/12/15.
 * 日期管理类
 * getActualMaximum()是获取给定日历字段的可能最大值这个指定是调用这个方法的calender对象,在你的程序中就是c中指定的c.setTime(d)
 */
public class CalendarManagerUtils {
    //获取当前的日期数据
    private Date currentDate;
    //获取指定的日期数据
    private Date specificDate;
    //获取下一个月的日期数据
    private Date nextMonthDate;
    //获取上一个月的日期数据
    private Date preMonthDate;
    //获取农历日期数据
    private Date lunarDate;
    //获取特殊节日的日期数据
    private Date specialDate;
    //获取当前的操作模式,单选、多选、连选、不选
    private String selectMode;
    private static CalendarManagerUtils managerUtils;
    private int mYear;
    private int mMonth;
    private int mDay;
    private int mdayofWeek;
    private int maxNum;
    private Calendar instancecalendar;
    private static Date curDate; // 当前日历显示的月
    //装载去年今年明年数据
    ArrayList threeArrList = new ArrayList<>();

    public ArrayList getThreeArrList() {
        return threeArrList;
    }

    public void setThreeArrList(ArrayList<Map> threeArrList) {
        this.threeArrList = threeArrList;
    }

    /**
     * 初始化当前日期管理对象
     *
     * @return
     */
    public static CalendarManagerUtils getInstance() {
        if (managerUtils == null) {
            managerUtils = new CalendarManagerUtils();

        }
        return managerUtils;
    }

    /**
     * 初始化当前日期
     */
    public void initCalendarDate() {
        instancecalendar = Calendar.getInstance();
        curDate = new Date();
        instancecalendar.setTime(curDate);
        mYear = instancecalendar.get(Calendar.YEAR); //获取当前年份
        mMonth = instancecalendar.get(Calendar.MONTH) + 1;//获取当前月份
        mDay = instancecalendar.get(Calendar.DAY_OF_MONTH);//获取当前月份的日期号码
        instancecalendar.set(Calendar.DATE, 1);//把日期设置为当月第一天
        mdayofWeek = instancecalendar.get(Calendar.DAY_OF_WEEK);//这周第几天
        instancecalendar.roll(Calendar.DATE, -1);//日期回滚一天,也就是最后一天
        maxNum = instancecalendar.get(Calendar.DATE);


    }

    /**
     * 获取最近三年的数据
     *
     * @param
     * @return
     */
    public void setThreeYearArralistDatas() {
        threeArrList.clear();
        Calendar calendar = Calendar.getInstance();
        int year = calendar.get(Calendar.YEAR); //获取当前年份
        calendar.set(year - 1, 0, 1);//指定去年的1月1号
        //获取去年一月份数据
        int mYearone = calendar.get(Calendar.YEAR); //获取当前年份
        int mMonthonte = calendar.get(Calendar.MONTH) + 1;//获取当前月份
        calendar.set(Calendar.DATE, 1);//把日期设置为当月第一天
        int  mdayofWeekone = calendar.get(Calendar.DAY_OF_WEEK);//这周第几天
        calendar.roll(Calendar.DATE, -1);//日期回滚一天,也就是最后一天
        int  maxNumone = calendar.get(Calendar.DATE);
        Map<String,Integer> mapone=new HashMap<>();
        mapone.put("mYear",mYearone);
        mapone.put("mMonth",mMonthonte);
        mapone.put("mdayofWeek",mdayofWeekone);
        mapone.put("maxNum",maxNumone);
        threeArrList.add(0,mapone);
        for (int i = 1; i < 36; i++) {
            calendar.add(Calendar.MONTH, 1);
            int mYear = calendar.get(Calendar.YEAR); //获取当前年份
            int mMonth = calendar.get(Calendar.MONTH) + 1;//获取当前月份
            calendar.set(Calendar.DATE, 1);//把日期设置为当月第一天
            int mdayofWeek = calendar.get(Calendar.DAY_OF_WEEK);//这周第几天
            calendar.roll(Calendar.DATE, -1);//日期回滚一天,也就是最后一天
            int maxNum = calendar.get(Calendar.DATE);
            Map<String,Integer> map=new HashMap<>();
            map.put("mYear",mYear);
            map.put("mMonth",mMonth);
            map.put("mdayofWeek",mdayofWeek);
            map.put("maxNum",maxNum);
            threeArrList.add(i,map);
        }
        //需要添加假数据来对应6*7=42
        for (int z = 36; z < 42; z++) {
            Map<Integer,Integer> constructMao=new HashMap<>();
            constructMao.put(z,0);
            threeArrList.add(z,"36");//这里添加是为了防止后面的第三十六位读取不到数据
        }



    }


    /**
     * 上一月数据
     */
    public void setPreMonthDate() {
        instancecalendar.setTime(curDate);
        instancecalendar.add(Calendar.MONTH, -1);
        curDate = instancecalendar.getTime();
        mYear = instancecalendar.get(Calendar.YEAR); //获取当前年份
        mMonth = instancecalendar.get(Calendar.MONTH) + 1;//获取当前月份
        instancecalendar.set(Calendar.DATE, 1);//把日期设置为当月第一天
        mdayofWeek = instancecalendar.get(Calendar.DAY_OF_WEEK);//这周第几天
        instancecalendar.roll(Calendar.DATE, -1);//日期回滚一天,也就是最后一天
        maxNum = instancecalendar.get(Calendar.DATE);
        Log.i("sadf", "curDate" + curDate + ":mYear" + mYear + ":mMonth" + mMonth + ":mDay" + mDay + ":maxNum" + maxNum + ":mdayofWeek" + mdayofWeek);
    }

    /**
     * 下一月数据
     */
    public void setNextMonthDate() {
        instancecalendar.setTime(curDate);
        instancecalendar.add(Calendar.MONTH, 1);
        curDate = instancecalendar.getTime();
        mYear = instancecalendar.get(Calendar.YEAR); //获取当前年份
        mMonth = instancecalendar.get(Calendar.MONTH) + 1;//获取当前月份
        instancecalendar.set(Calendar.DATE, 1);//把日期设置为当月第一天
        mdayofWeek = instancecalendar.get(Calendar.DAY_OF_WEEK);//这周第几天
        instancecalendar.roll(Calendar.DATE, -1);//日期回滚一天,也就是最后一天
        maxNum = instancecalendar.get(Calendar.DATE);

        Log.i("sadf", "curDate" + curDate + ":mYear" + mYear + ":mMonth" + mMonth + ":mDay" + mDay + ":maxNum" + maxNum + ":mdayofWeek" + mdayofWeek);


    }

    public int getmYear() {
        return mYear;
    }

    public void setmYear(int mYear) {
        this.mYear = mYear;
    }

    public int getmMonth() {
        return mMonth;
    }

    public void setmMonth(int mMonth) {
        this.mMonth = mMonth;
    }

    public int getmDay() {
        return mDay;
    }

    public void setmDay(int mDay) {
        this.mDay = mDay;
    }

    public int getMdayofWeek() {
        return mdayofWeek;
    }

    public void setMdayofWeek(int mdayofWeek) {
        this.mdayofWeek = mdayofWeek;
    }

    public int getMaxNum() {
        return maxNum;
    }

    public void setMaxNum(int maxNum) {
        this.maxNum = maxNum;
    }

    /**
     * 取得当月天数
     */
    public static int getCurrentMonthLastDay() {
        Calendar a = Calendar.getInstance();
        a.set(Calendar.DATE, 1);//把日期设置为当月第一天
        a.roll(Calendar.DATE, -1);//日期回滚一天,也就是最后一天
        int maxDate = a.get(Calendar.DATE);
        return maxDate;
    }

    /**
     * 得到指定月的天数
     */
    public static int getMonthLastDay(int year, int month) {
        Calendar a = Calendar.getInstance();
        a.set(Calendar.YEAR, year);
        a.set(Calendar.MONTH, month - 1);
        a.set(Calendar.DATE, 1);//把日期设置为当月第一天
        a.roll(Calendar.DATE, -1);//日期回滚一天,也就是最后一天
        int maxDate = a.get(Calendar.DATE);
        return maxDate;
    }

//-------------------------------------------------------------------------------------------------//
//    /**
//     * 得到二个日期间的间隔天数
//     */
//    public static String getTwoDay(String sj1, String sj2) {
//        SimpleDateFormat myFormatter = new SimpleDateFormat("yyyy-MM-dd");
//        long day = 0;
//        try {
//            java.util.Date date = myFormatter.parse(sj1);
//            java.util.Date mydate = myFormatter.parse(sj2);
//            day = (date.getTime() - mydate.getTime()) / (24 * 60 * 60 * 1000);
//        } catch (Exception e) {
//            return "";
//        }
//        return day + "";
//    }
//
//    // 上月第一天
//    public String getPreviousMonthFirst() {
//        String str = "";
//        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//        Calendar lastDate = Calendar.getInstance();
//        lastDate.set(Calendar.DATE, 1);//设为当前月的1 号
//        lastDate.add(Calendar.MONTH, -1);//减一个月,变为下月的1 号
////lastDate.add(Calendar.DATE,-1);//减去一天,变为当月最后一天
//        str = sdf.format(lastDate.getTime());
//        return str;
//    }
//
//    //获取当月第一天
//    public String getFirstDayOfMonth() {
//        String str = "";
//        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//        Calendar lastDate = Calendar.getInstance();
//        lastDate.set(Calendar.DATE, 1);//设为当前月的1 号
//        str = sdf.format(lastDate.getTime());
//        return str;
//    }
//
//    /**
//     * 获取当月的天数
//     */
//    public static int getCurrentMonthDay() {
//        Calendar a = Calendar.getInstance();
//        a.set(Calendar.DATE, 1);//把日期设置为当月第一天
//        a.roll(Calendar.DATE, -1);//日期回滚一天,也就是最后一天
//        int maxDate = a.get(Calendar.DATE);
//        return maxDate;
//    }
//
//    /**
//     * 获取某月天数
//     *
//     * @param date
//     * @return
//     */
//    public static int getDaysOfMonth(Date date) {
//        Calendar calendar = Calendar.getInstance();
//        calendar.setTime(date);
//        return calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
//    }
//
//    /**
//     * 根据 年、月 获取对应的月份 的 天数
//     */
//    public static int getDaysByYearMonth(int year, int month) {
//        Calendar a = Calendar.getInstance();
//        a.set(Calendar.YEAR, year);
//        a.set(Calendar.MONTH, month - 1);
//        a.set(Calendar.DATE, 1);
//        a.roll(Calendar.DATE, -1);
//        int maxDate = a.get(Calendar.DATE);
//        return maxDate;
//    }
}


package common.com.commoncalendar.Utils;


/**
 * 数组操作工具类
 *
 * Utils of data operation
 *
 * @author AigeStudio 2015-07-22
 */
public final class DataUtils {
    /**
     * 一维数组转换为二维数组
     *
     * @param src    ...
     * @param row    ...
     * @param column ...
     * @return ...
     */
    public static String[][] arraysConvert(String[] src, int row, int column) {
        String[][] tmp = new String[row][column];
        for (int i = 0; i < row; i++) {
            tmp[i] = new String[column];
            System.arraycopy(src, i * column, tmp[i], 0, column);
        }
        return tmp;
    }
}


package common.com.commoncalendar.Utils;
/**
 * 日期选择模式
 * 支持单选、多选、不选、连选展示 ,水平滑动,上下滑动
 * Date select mode
 * Support SINGLE or MULTIPLE or Display only.
 *
 * @author AigeStudio 2015-07-02
 */
public enum DPMode {
    SINGLE, MULTIPLE,CONNATION,VERTICAL,HORIZONTAL;
}


package common.com.commoncalendar.Utils;

/**
 * Created by zhq_zhao on 2017/12/14.
 */

import android.content.Context;

/**
 * 测量工具类
 *
 * Util of measure.
 *
 * @author AigeStudio 2015-03-26
 */
public final class MeasureUtil {
    public static int dp2px(Context context, float dp) {
        float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dp * scale + 0.5f);
    }

    public static int px2dp(Context context, float px) {
        float scale = context.getResources().getDisplayMetrics().density;
        return (int) (px / scale + 0.5f);
    }
}


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:layout_height="match_parent">
    <ListView
        android:listSelector="#00000000"
        android:id="@+id/list_item"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </ListView>
</LinearLayout>


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:paddingTop="@dimen/dp_5"
    android:id="@+id/ll_select"
    android:paddingBottom="@dimen/dp_5"
    android:layout_height="@@dimen/dp_80"
    android:orientation="vertical">

    <TextView
        android:id="@+id/tv_date"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:text="0"
        android:layout_gravity="center"
        android:layout_marginTop="@dimen/dp_10"
        android:gravity="center"
        android:textColor="@color/black"
        android:textSize="@dimen/sp_15" />
    <TextView
        android:id="@+id/tv_lunarCalendar"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:layout_gravity="center"
        android:layout_marginTop="@dimen/dp_10"
        android:gravity="center"
        android:textColor="@color/gray"
        android:textSize="@dimen/sp_8" />
</LinearLayout>


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:layout_marginLeft="@dimen/dp_10"
    android:layout_marginRight="@dimen/dp_10"
    android:layout_marginTop="@dimen/dp_10"
    android:gravity="center"
    android:orientation="horizontal">

    <TextView
        android:id="@+id/tv_year"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_weight="1"
        android:gravity="center|left"
        android:text="2017年"
        android:textColor="@color/black" />

    <TextView
        android:id="@+id/tv_month"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_weight="1"
        android:gravity="center"
        android:text="12月"
        android:textColor="@color/black" />

    <TextView
        android:id="@+id/tv_cancle"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_weight="1"
        android:gravity="center|right"
        android:text="取消"
        android:textColor="@color/black" />

    <TextView
        android:id="@+id/tv_ok"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_weight="1"
        android:gravity="center|right"
        android:text="确定"
        android:textColor="@color/black" />
</LinearLayout>


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:gravity="center"
    android:orientation="horizontal">


    <TextView
        style="@style/textview"
        android:text="星期天" />

    <TextView
        style="@style/textview"
        android:text="星期一" />

    <TextView
        style="@style/textview"
        android:text="星期二" />

    <TextView
        style="@style/textview"
        android:text="星期三" />

    <TextView
        style="@style/textview"
        android:text="星期四" />

    <TextView
        style="@style/textview"
        android:text="星期五" />

    <TextView
        style="@style/textview"
        android:text="星期六" />
</LinearLayout>

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
  <!--  头部样式-->
    <include layout="@layout/item_header" />
    <View
        android:layout_width="match_parent"
        android:layout_height="@dimen/dp_10"
        android:background="@color/login_line" />

    <LinearLayout
        android:descendantFocusability="afterDescendants"
        android:layout_margin="@dimen/dp_10"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <!-- 星期-->
        <include layout="@layout/item_week" />
        <View
            android:layout_width="match_parent"
            android:layout_height="@dimen/dp_10"
            android:background="@color/login_line" />
       <!-- 天数六行七列-->
       <common.com.commoncalendar.View.MyGridView
           android:listSelector="#00000000"
           android:numColumns="7"
           android:id="@+id/item_gridview"
           android:layout_width="match_parent"
           android:layout_height="wrap_content"/>

    </LinearLayout>
</LinearLayout>

4下载地址:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BACKWASH2038

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值