Android uses GridView to implement a simple calendar

Simple calendar implementation, only displays each month, does not display the functions of the day and notes

Write picture description hereWrite picture description here

It mainly calculates the day of the week at the beginning of the month and the day at the end of the month, and then displays the number of days in the previous month and the number of days in the next month accordingly.

Let's take a look at several tools used for dates

 /**
     * 获取该月天数
     */
    public static int getCurrentMonthDay(long millSec) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(millSec);
        calendar.set(Calendar.DATE, 1);
        calendar.roll(Calendar.DATE, -1);
        int dateCount = calendar.get(Calendar.DATE);
        return dateCount;
    }

    /**
     * 获取当月第一天
     */
    public static long getFirOfMonth(long millSec) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(millSec);
        calendar.set(Calendar.DATE, 1);
        return calendar.getTimeInMillis();
    }

    /**
     * 获取当前时间戳
     */
    public static long getCurrentTime() {
        Calendar calendar = Calendar.getInstance();
        return calendar.getTimeInMillis();
    }

    /**
     * 获取上一月/下一月
     */
    public static long getLastOrNextMonth(long millSec, int count) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(millSec);
        calendar.add(Calendar.MONTH, count);
        return calendar.getTimeInMillis();
    }

    /**
     * 格式化到月份
     */
    public static String long2str(long millSec) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
        return sdf.format(new Date(millSec));
    }

Use a List to store each day, because we considered that there are notes for each day, so we encapsulate a class, if you don't need it, you can just use a timestamp.
After opening, get the current timestamp first, and then initialize it to the first day of the current month through the method in the tool class.
Then it is calculated, and the balance of the previous month, all this month, and the next month are added to the list together.

 private void setCalendarList(long millSecs) {
        beans.clear();
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(millSecs);
//        int nor = today.getDay();
        int max = DateUtil.getCurrentMonthDay(millSecs);
        /**
         * 当月日历
         */
        for (int i = 1; i <= max; i++) {
    
    
            DayBean bean = new DayBean();
            Calendar cc = Calendar.getInstance();
            cc.setTimeInMillis(millSecs);
            cc.add(Calendar.DAY_OF_MONTH, i - 1);
            setBean(bean, cc);
            bean.setIsCurrentMonth(true);
            beans.add(bean);
        }
        //上月结余
        int fir_day_of_week = beans.get(0).getCalendar().get(Calendar.DAY_OF_WEEK);
        Log.e("AAA", "week_last:" + fir_day_of_week);
        if (fir_day_of_week != 2) {
            if(fir_day_of_week == 1){
                for (int i = 0; i < 6; i++) {
    
    
                    DayBean bean = new DayBean();
                    Calendar cc = Calendar.getInstance();
                    cc.setTimeInMillis(millSecs);
                    cc.add(Calendar.DAY_OF_MONTH, -i -1);
                    setBean(bean, cc);
                    Log.e("AAA", "last:" + bean.getDay());
                    bean.setIsCurrentMonth(false);
                    beans.add(0, bean);
                }
            }else{
                for (int i = 0; i < fir_day_of_week-2; i++) {
    
    
                    DayBean bean = new DayBean();
                    Calendar cc = Calendar.getInstance();
                    cc.setTimeInMillis(millSecs);
                    cc.add(Calendar.DAY_OF_MONTH, -i-1);
                    setBean(bean, cc);
                    Log.e("AAA", "last:" + bean.getDay());
                    bean.setIsCurrentMonth(false);
                    beans.add(0, bean);
                }
            }

        }
        //下月
        int last_day_of_week = beans.get(beans.size() - 1).getCalendar().get(Calendar.DAY_OF_WEEK);
        Log.e("AAA", "week_next:" + last_day_of_week);
        if (last_day_of_week != 1) {
            for (int i = last_day_of_week; i < 8; i++) {
    
    
                DayBean bean = new DayBean();
                Calendar cc = Calendar.getInstance();
                cc.setTimeInMillis(millSecs);
                cc.add(Calendar.DAY_OF_MONTH, i - last_day_of_week);
                setBean(bean, cc);
                Log.e("AAA", "next:" + bean.getDay());
                bean.setIsCurrentMonth(false);
                beans.add(bean);
            }
        }
        GridViewAdapter adapter = new GridViewAdapter(this, beans);
        mGridView.setAdapter(adapter);
    }

    private void setBean(DayBean bean, Calendar cc) {
        bean.setCalendar(cc);
        bean.setDay(cc.get(Calendar.DAY_OF_MONTH));
    }

When setting each day, set a field to whether it is the current month, if it is, set it to black, otherwise set it to gray display, just set it in the getView method in the Adapter.

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.item_layout, null);
            holder = new ViewHolder();
            holder.day_text = (TextView) convertView.findViewById(R.id.day_text);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.day_text.setText(beans.get(position).getDay() + "");
        if (beans.get(position).isToday()) {
            holder.day_text.setBackgroundColor(Color.RED);
        } else {
            holder.day_text.setBackgroundColor(Color.WHITE);
        }
        if (beans.get(position).isCurrentMonth()) {
            holder.day_text.setTextColor(Color.BLACK);
        } else {
            holder.day_text.setTextColor(Color.GRAY);
        }

        return convertView;
    }

    class ViewHolder {
        TextView day_text;
    }

Guess you like

Origin blog.csdn.net/lizebin_bin/article/details/51066513