Android 价格日历

查找过各种技术文档,发现android价格日历这一部分貌似还是空白,我就把真实项目中的代码给大家分析一下

有兴趣的朋友可以去下载源码

http://download.csdn.net/detail/qq_28195645/9607934

先给大家看效果图,左右滑动翻月,如果在某天之前没有可售的日子,那么会提示“xxxx-xx-xx之前无...”,并不能翻月。颜色,文字都可以自定义,


二、接下来我们讲解代码

直接上价格日历的控件,下面是关键代码


/**
 * 填充日历(包含日期、标记、背景等)
 */
private void setCalendarDate() {
    // 根据日历的日子获取这一天是星期几
    int weekday = calendarday.getDay();
    // 每个月第一天
    int firstDay = 1;
    // 每个月中间号,根据循环会自动++
    int day = firstDay;
    // 每个月的最后一天
    int lastDay = getDateNum(calendarday.getYear(), calendarday.getMonth());
    // 下个月第一天
    int nextMonthDay = 1;
    int lastMonthDay = 1;

    // 填充每一个空格
    for (int i = 0; i < ROWS_TOTAL; i++) {
        for (int j = 0; j < COLS_TOTAL; j++) {
            // 这个月第一天不是礼拜天,则需要绘制上个月的剩余几天
            if (i == 0 && j == 0 && weekday != 0) {
                int year = 0;
                int month = 0;
                int lastMonthDays = 0;
                // 如果这个月是1月,上一个月就是去年的12月
                if (calendarday.getMonth() == 0) {
                    year = calendarday.getYear() - 1;
                    month = Calendar.DECEMBER;
                } else {
                    year = calendarday.getYear();
                    month = calendarday.getMonth() - 1;
                }
                // 上个月的最后一天是几号
                lastMonthDays = getDateNum(year, month);
                // 第一个格子展示的是几号
                int firstShowDay = lastMonthDays - weekday + 1;
                // 上月
                for (int k = 0; k < weekday; k++) {
                    lastMonthDay = firstShowDay + k;
                    LinearLayout group = getDateView(0, k);
                    group.setGravity(Gravity.CENTER);
                    LinearLayout view = null;
                    if (group.getChildCount() > 0) {
                        view = (LinearLayout) group.getChildAt(0);
                    } else {
                        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                                ViewGroup.LayoutParams.MATCH_PARENT, -1);
                        view = new LinearLayout(getContext());
                        view.setLayoutParams(params);
                        view.setGravity(Gravity.CENTER);
                        view.setOrientation(LinearLayout.VERTICAL);
                        //                            view = (LinearLayout) LayoutInflater.from(getContext()).inflate(R.layout.calendar_day_item, null);
                        group.addView(view);
                    }
                    //日历中的日期
                    //                        TextView txtvDay = (TextView) view.findViewById(R.id.txtv_day_calendaritem);
                    TextView txtvDay = null;
                    TextView txtvPrice = null;
                    if (view.
                            getChildCount() > 0) {
                        txtvDay = (TextView) view.getChildAt(0);
                        txtvPrice = (TextView) view.getChildAt(1);
                    } else {
                        LinearLayout.LayoutParams paramsDay = new LinearLayout.LayoutParams(
                                ViewGroup.LayoutParams.MATCH_PARENT, 0, 1.5f);
                        txtvDay = new TextView(getContext());
                        txtvPrice = new TextView(getContext());
                        txtvDay.setLayoutParams(paramsDay);
                        txtvDay.setGravity(Gravity.CENTER);
                        txtvDay.setTextSize(10);
                        LinearLayout.LayoutParams paramsPrice = new LinearLayout.LayoutParams(
                                ViewGroup.LayoutParams.MATCH_PARENT, 0, 2f);
                        txtvPrice.setLayoutParams(paramsDay);
                        txtvPrice.setGravity(Gravity.CENTER);
                        txtvPrice.setTextSize(10);
                        view.addView(txtvDay);
                        view.addView(txtvPrice);
                    }
                    txtvDay.setText(Integer.toString(lastMonthDay));
                    txtvDay.setTextColor(COLOR_TX_OTHER_MONTH_DAY);
                    txtvPrice.setTextColor(COLOR_TX_OTHER_MONTH_DAY);
                    dates[0][k] = format(new Date(year, month, lastMonthDay));
                    // 设置日期背景色
                    if (dayBgColorMap.get(dates[0][k]) != null) {
                        // view.setBackgroundResource(dayBgColorMap
                        // .get(dates[i][j]));
                    } else {
                        //                            view.setBackgroundColor(Color.TRANSPARENT);
                        ((LinearLayout) view.getParent()).setBackgroundResource(R.drawable.calendar_day_bg);
                    }
                    // 设置标记
                    setMarker(group, 0, k);
                }
                j = weekday - 1;
                // 这个月第一天是礼拜天,不用绘制上个月的日期,直接绘制这个月的日期
            } else {
                LinearLayout group = getDateView(i, j);
                group.setGravity(Gravity.CENTER);

                LinearLayout view = null;
                if (group.
                        getChildCount() > 0) {
                    view = (LinearLayout) group.getChildAt(0);
                } else {

                    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                            ViewGroup.LayoutParams.MATCH_PARENT, -1);
                    view = new LinearLayout(getContext());
                    view.setLayoutParams(params);
                    view.setGravity(Gravity.CENTER);
                    view.setOrientation(LinearLayout.VERTICAL);
                    group.addView(view);
                    //                        view = (LinearLayout) LayoutInflater.from(getContext()).inflate(R.layout.calendar_day_item, null);
                }

                // 本月
                if (day <= lastDay) {
                    dates[i][j] = format(new Date(calendarday.getYear(),
                            calendarday.getMonth(), day));
                    TextView txtvDay = null;
                    TextView txtvPrice = null;
                    if (view.
                            getChildCount() > 0) {
                        txtvDay = (TextView) view.getChildAt(0);
                        txtvPrice = (TextView) view.getChildAt(1);
                    } else {
                        LinearLayout.LayoutParams paramsDay = new LinearLayout.LayoutParams(
                                ViewGroup.LayoutParams.MATCH_PARENT, 0, 1.5f);
                        txtvDay = new TextView(getContext());
                        txtvPrice = new TextView(getContext());
                        txtvDay.setLayoutParams(paramsDay);
                        txtvDay.setGravity(Gravity.CENTER);
                        txtvDay.setTextSize(10);
                        LinearLayout.LayoutParams paramsPrice = new LinearLayout.LayoutParams(
                                ViewGroup.LayoutParams.MATCH_PARENT, 0, 2f);
                        txtvPrice.setLayoutParams(paramsDay);
                        txtvPrice.setGravity(Gravity.CENTER);
                        txtvPrice.setTextSize(10);
                        //                        view = (LinearLayout) LayoutInflater.from(getContext()).inflate(R.layout.calendar_day_item, null);
                        view.addView(txtvDay);
                        view.addView(txtvPrice);
                    }

                    txtvPrice.setText("");
                    /**
                     * 获得本月的group
                     */
                    if (groups != null && groups.size() != 0) {
                        List<GroupDeadline> thisMonths = new ArrayList<GroupDeadline>();

                        for (int m = 0; m < groups.size(); m++) {
                            //dates.add(groups.get(i).getDate());
                            int thisyear = getYear(groups.get(m).getDate());
                            int thismonth = getMonth(groups.get(m).getDate());
                            if (thisyear - 1900 == calendarday.getYear()) {
                                if (thismonth - 1 == calendarday.getMonth()) {
                                    thisMonths.add(groups.get(m));
                                }
                            }
                        }
                        for (int d = 0; d < thisMonths.size(); d++) {
                            if (day == getDay(thisMonths.get(d).getDate())) {
                                //                                    if (thisMonths.get(d).getState() == 0) {
                                //                                        txtvPrice.setText("");
                                //                                    } else
                                if (Integer.parseInt(thisMonths.get(d).getStock()) > 0) {

                                    txtvPrice.setText("¥" + thisMonths.get(d).getSell_price_adult());
                                } else {
                                    txtvPrice.setText("售罄");
                                }
                            }
                        }
                    }
                    txtvDay.setText(Integer.toString(day));
                    // 当天
                    if (thisday.getDate() == day
                            && thisday.getMonth() == calendarday.getMonth()
                            && thisday.getYear() == calendarday.getYear()) {
                        txtvDay.setText("今天");
                        txtvDay.setTextColor(COLOR_TX_WEEK_TITLE);
                        txtvPrice.setTextColor(COLOR_TX_PRICE);
                        ((LinearLayout) view.getParent()).setBackgroundResource(R.drawable.calendar_day_bg);
                    } else {
                        txtvDay.setTextColor(COLOR_TX_THIS_MONTH_DAY);
                        txtvPrice.setTextColor(COLOR_TX_PRICE);
                        ((LinearLayout) view.getParent()).setBackgroundResource(R.drawable.calendar_day_bg);
                    }
                    // 上面首先设置了一下默认的"当天"背景色,当有特殊需求时,才给当日填充背景色
                    // 设置日期背景色
                    if (dayBgColorMap.get(dates[i][j]) != null) {
                        txtvDay.setTextColor(Color.WHITE);
                        txtvPrice.setTextColor(Color.WHITE);
                        ((LinearLayout) view.getParent()).setBackgroundColor(dayBgColorMap
                                .get(dates[i][j]));
                    }
                    // 设置标记
                    setMarker(group, i, j);
                    day++;
                    // 下个月
                } else {
                    TextView txtvDay = null;
                    TextView txtvPrice = null;
                    if (view.
                            getChildCount() > 0) {
                        txtvDay = (TextView) view.getChildAt(0);
                        txtvPrice = (TextView) view.getChildAt(1);
                    } else {
                        LinearLayout.LayoutParams paramsDay = new LinearLayout.LayoutParams(
                                ViewGroup.LayoutParams.MATCH_PARENT, 0, 1.5f);
                        txtvDay = new TextView(getContext());
                        txtvPrice = new TextView(getContext());
                        txtvDay.setLayoutParams(paramsDay);
                        txtvDay.setGravity(Gravity.CENTER);
                        txtvDay.setTextSize(10);
                        LinearLayout.LayoutParams paramsPrice = new LinearLayout.LayoutParams(
                                ViewGroup.LayoutParams.MATCH_PARENT, 0, 2f);
                        txtvPrice.setLayoutParams(paramsDay);
                        txtvPrice.setGravity(Gravity.CENTER);
                        txtvPrice.setTextSize(10);
                        //                        view = (LinearLayout) LayoutInflater.from(getContext()).inflate(R.layout.calendar_day_item, null);
                        view.addView(txtvDay);
                        view.addView(txtvPrice);
                    }
                    //                        TextView txtvDay = (TextView) view.findViewById(R.id.txtv_day_calendaritem);
                    if (calendarday.getMonth() == Calendar.DECEMBER) {
                        dates[i][j] = format(new Date(
                                calendarday.getYear() + 1,
                                Calendar.JANUARY, nextMonthDay));
                    } else {
                        dates[i][j] = format(new Date(
                                calendarday.getYear(),
                                calendarday.getMonth() + 1, nextMonthDay));
                    }
                    txtvDay.setText(Integer.toString(nextMonthDay));
                    txtvDay.setTextColor(COLOR_TX_OTHER_MONTH_DAY);
                    txtvPrice.setTextColor(COLOR_TX_OTHER_MONTH_DAY);
                    // 设置日期背景色
                    if (dayBgColorMap.get(dates[i][j]) != null) {
                        // view.setBackgroundResource(dayBgColorMap
                        // .get(dates[i][j]));
                    } else {
                        ((LinearLayout) view.getParent()).setBackgroundResource(R.drawable.calendar_day_bg);
                    }
                    // 设置标记
                    setMarker(group, i, j);
                    nextMonthDay++;
                }
            }
        }
    }
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值