当前位置:   article > 正文

Android 自定义日历控件_android 日历控件

android 日历控件

在这里插入图片描述

package com.hzcy.doctor.view;

import android.content.Context;
import android.graphics.Color;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.hzcy.doctor.R;
import com.hzcy.doctor.hospital.bean.PlanBean;

import org.w3c.dom.Text;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 新日历视图
 *
 * @author zhangpenghui
 * @date 2022/11/10
 */
public class NewCalendarView extends LinearLayout {
    private ImageView lastTv, nextTv;
    private TextView dateTv;
    private GridView calendarGv;

    private Calendar calendar = Calendar.getInstance();  //日历控件初始化

    public NewCalendarListener listener;
    CalendarAdapter calendarAdapter;

    //重写三个构造方法
    public NewCalendarView(Context context) {
        super(context);
    }

    public NewCalendarView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        initControl(context);  //绑定控件
    }

    public NewCalendarView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initControl(context);  //绑定控件
    }

    private void initControl(Context context) {
        calendar.setFirstDayOfWeek(Calendar.MONDAY);
        bindControl(context);  //绑定控件
        bindControlEvent();   //绑定控件事件
    }

    //绑定控件事件方法
    private void bindControlEvent() {
        renderCalendar();
        //“下一月”点击事件
        nextTv.setOnClickListener(v -> {
            calendar.add(Calendar.MONTH, +1);   //月份+1
            renderCalendar();
            if (listener != null) {
                Date date = new Date();
                int month = getMonth();
                listener.onNextMonth(month - date.getMonth());
            }
        });
        //“上一个”点击事件
        lastTv.setOnClickListener(v -> {
            calendar.add(Calendar.MONTH, -1);   //月份-1
            renderCalendar();
            if (listener != null) {
                Date date = new Date();
                int month = getMonth();
                listener.onNextMonth(month - date.getMonth());
            }
        });
    }

    private int getMonth() {
        int month = calendar.get(Calendar.MONTH);
        return month;
    }


    private void renderCalendar() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月");  //日期格式化
        dateTv.setText(sdf.format(calendar.getTime()));  //设置月份
        ArrayList<Date> cells = new ArrayList<>();
        Calendar calendar1 = (Calendar) calendar.clone();  //克隆日历对象
        calendar1.setFirstDayOfWeek(Calendar.MONDAY);
        calendar1.set(Calendar.DAY_OF_MONTH, 1);  //置于当月第一天;
        int prevDays = calendar1.get(Calendar.DAY_OF_WEEK) - 2;  //获取上个月最后一天是星期几
        calendar1.add(Calendar.DAY_OF_MONTH, -prevDays);  //第一天
        //修改星期排列后 每月第一天可能不是1号  日期需要前推一周
        int day = calendar1.get(Calendar.DAY_OF_MONTH);
        int monthO = calendar1.get(Calendar.MONTH);
        int monthN = calendar.get(Calendar.MONTH);
        if (monthO == monthN && day > 1) {
            calendar1.add(Calendar.DAY_OF_MONTH, -7);
        }
//        获取每月有几周
        int actualMaximum = calendar.getActualMaximum(Calendar.WEEK_OF_MONTH);
        int maxCount = actualMaximum * 7;  //设置每个月最大天数
        //循环存入集合中
        while (cells.size() < maxCount) {
            cells.add(calendar1.getTime());
            calendar1.add(Calendar.DAY_OF_MONTH, 1);  //日期+1
        }
        calendarAdapter = new CalendarAdapter(getContext(), cells);
        //设置适配器
        calendarGv.setAdapter(calendarAdapter);
        //适配器长按事件
        calendarGv.setOnItemClickListener((parent, view, position, id) -> {
            if (listener == null) {

            } else {
                //获取长按的位置,传入onItemClick方法中
                Date atPosition = (Date) parent.getItemAtPosition(position);
                listener.onItemClick(atPosition);
                calendarAdapter.selectDate(atPosition);
            }
        });
    }

    public void setListener(NewCalendarListener listener) {
        this.listener = listener;
    }

    //适配器
    private class CalendarAdapter extends ArrayAdapter<Date> {
        LayoutInflater layoutInflater;
        Date selDate = null;

        public CalendarAdapter(@NonNull Context context, ArrayList<Date> days) {
            super(context, R.layout.item_layout, days);
            layoutInflater = LayoutInflater.from(context);
        }

        @NonNull
        @Override
        public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
            Date date = getItem(position);
            ViewHolder viewHolder;
            if (convertView == null) {  //初始化绑定
                convertView = layoutInflater.inflate(R.layout.item_layout, parent, false);
                viewHolder = new ViewHolder();
                viewHolder.itemTv = convertView.findViewById(R.id.itemTv);
                viewHolder.itemState = convertView.findViewById(R.id.itemState);
                viewHolder.layView = convertView.findViewById(R.id.lay);
                convertView.setTag(viewHolder);
            }
            viewHolder = (ViewHolder) convertView.getTag();
            int day = date.getDate();
            viewHolder.itemTv.setText(String.valueOf(day));  //赋值

            Date now = new Date();
            if (selDate != null) {
                now = selDate;
            }
            Boolean isTheSameMonth = false;  //是否与当前月份相同
            //判断显示的日期月份与当前月份相同
//            if (date.getMonth() == now.getMonth()) {  //月份相同
//                isTheSameMonth = true;
//            }
            if (date.getMonth() == getMonth()) {  //月份相同
                isTheSameMonth = true;
            }
            //若显示的日期月份与当前月份相同,则设置字体颜色是黑色
            if (isTheSameMonth) {
                viewHolder.itemTv.setTextColor(Color.parseColor("#333333"));
            } else {
                viewHolder.itemTv.setTextColor(Color.parseColor("#999999"));
            }
            //设置当前日期字体为红色
            if (now.getDate() == date.getDate() && now.getMonth() == date.getMonth() && now.getYear() == date.getYear()) {
//                viewHolder.itemTv.setTextColor(Color.parseColor("#ff0000"));
                viewHolder.layView.setBackground(getContext().getResources().getDrawable(R.drawable.bg_corner_4_20_p));
                viewHolder.itemState.setTextColor(Color.WHITE);
            } else {
                viewHolder.layView.setBackgroundColor(Color.WHITE);
                viewHolder.itemState.setTextColor(getContext().getResources().getColor(R.color.theme_color));
            }

            String ds = new SimpleDateFormat("yyyy-MM-dd").format(date);
//            System.out.println(ds);
//            PlanBean planBean = mapList.get(ds);
            if (mapList.containsKey(ds)) {
                viewHolder.itemState.setText("出诊");
            } else {
                viewHolder.itemState.setText("");
            }

            return convertView;
        }

        public void selectDate(Date date) {
            selDate = date;
            notifyDataSetChanged();
        }

        class ViewHolder {
            TextView itemTv;
            TextView itemState;
            View layView;
        }
    }

    //长按事件接口
    public interface NewCalendarListener {
        void onItemClick(Date date);

        void onNextMonth(int next);
    }

    //控件绑定方法
    private void bindControl(Context context) {
        LayoutInflater inflater = LayoutInflater.from(context);
        inflater.inflate(R.layout.calendar_layout, this);


        lastTv = findViewById(R.id.lastTv);
        nextTv = findViewById(R.id.nextTv);
        dateTv = findViewById(R.id.dateTv);
        calendarGv = findViewById(R.id.calendarGv);
    }


    Map<String, PlanBean> mapList = new HashMap<>();

    public void showListData(List<PlanBean> ls) {
        mapList.clear();
        for (PlanBean bean : ls) {
//            System.out.println(bean.getDate());
            mapList.put(bean.getDate(), bean);
        }
        calendarAdapter.notifyDataSetChanged();
    }

    public PlanBean getPostionBean(Date date) {
        String ds = new SimpleDateFormat("yyyy-MM-dd").format(date);
        return mapList.get(ds);
    }

    //    设置选择今天高亮
    public void setSelect() {
        calendarAdapter.selectDate(new Date());
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243
  • 244
  • 245
  • 246
  • 247
  • 248
  • 249
  • 250
  • 251
  • 252
  • 253
  • 254
  • 255
  • 256
  • 257
  • 258
  • 259
  • 260
  • 261
  • 262
  • 263
  • 264
package com.hzcy.doctor.hospital.bean

import com.hzcy.doctor.net.response.PlanShiftsListRes

class PlanBean {
    var date: String? = ""
    var week: String? = ""
    var day: Int? = 0
    var month: Int? = 0
    var year: Int? = 0
    var shiftIds: List<String>? = ArrayList()
    var shifts: List<PlanShiftsListRes>? = ArrayList()
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

calendar_layout

<?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:gravity="center"
    android:orientation="vertical"
    android:padding="@dimen/d20dp">

    <androidx.appcompat.widget.LinearLayoutCompat
        android:id="@+id/titleRl"
        android:layout_width="wrap_content"
        android:layout_height="@dimen/d20dp"
        android:gravity="center_vertical">

        <ImageView
            android:id="@+id/lastTv"
            android:layout_width="@dimen/d40dp"
            android:layout_height="@dimen/d20dp"
            android:gravity="center"
            android:src="@mipmap/ic_calendar_left" />

        <TextView
            android:id="@+id/dateTv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:gravity="center"
            android:text="2022年11月"
            android:textColor="@color/color_333333"
            android:textSize="@dimen/d14sp"
            android:textStyle="bold" />

        <ImageView
            android:id="@+id/nextTv"
            android:layout_width="@dimen/d40dp"
            android:layout_height="@dimen/d20dp"
            android:gravity="center"
            android:src="@mipmap/ic_calendar_right" />
    </androidx.appcompat.widget.LinearLayoutCompat>

    <LinearLayout
        android:id="@+id/weekLl"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="@dimen/d20dp"
        android:orientation="horizontal">


        <TextView
            android:id="@+id/Tv1"
            android:layout_width="0dp"
            android:layout_height="30dp"
            android:layout_weight="1"
            android:gravity="center"
            android:text="周一"
            android:textColor="@color/color_333333"
            android:textSize="@dimen/d12sp" />

        <TextView
            android:id="@+id/Tv2"
            android:layout_width="0dp"
            android:layout_height="30dp"
            android:layout_weight="1"
            android:gravity="center"
            android:text="周二"
            android:textColor="@color/color_333333"
            android:textSize="@dimen/d12sp" />

        <TextView
            android:id="@+id/Tv3"
            android:layout_width="0dp"
            android:layout_height="30dp"
            android:layout_weight="1"
            android:gravity="center"
            android:text="周三"
            android:textColor="@color/color_333333"
            android:textSize="@dimen/d12sp" />

        <TextView
            android:id="@+id/Tv4"
            android:layout_width="0dp"
            android:layout_height="30dp"
            android:layout_weight="1"
            android:gravity="center"
            android:text="周四"
            android:textColor="@color/color_333333"
            android:textSize="@dimen/d12sp" />

        <TextView
            android:id="@+id/Tv5"
            android:layout_width="0dp"
            android:layout_height="30dp"
            android:layout_weight="1"
            android:gravity="center"
            android:text="周五"
            android:textColor="@color/color_333333"
            android:textSize="@dimen/d12sp" />

        <TextView
            android:id="@+id/Tv6"
            android:layout_width="0dp"
            android:layout_height="30dp"
            android:layout_weight="1"
            android:gravity="center"
            android:text="周六"
            android:textColor="@color/color_333333"
            android:textSize="@dimen/d12sp" />

        <TextView
            android:id="@+id/Tv7"
            android:layout_width="0dp"
            android:layout_height="30dp"
            android:layout_weight="1"
            android:gravity="center"
            android:text="周日"
            android:textColor="@color/color_333333"
            android:textSize="@dimen/d12sp" />
    </LinearLayout>

    <GridView
        android:id="@+id/calendarGv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:numColumns="7" />

</LinearLayout>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127

item_layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/lay"
    android:layout_width="@dimen/d40dp"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:orientation="vertical">

    <TextView
        android:id="@+id/itemTv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="@dimen/d8dp"
        android:gravity="center"
        android:text="1"
        android:textColor="@color/color_999999"
        android:textSize="@dimen/d14sp" />

    <TextView
        android:id="@+id/itemState"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="@dimen/d5dp"
        android:layout_marginBottom="@dimen/d5dp"
        android:text="出诊"
        android:textColor="@color/theme_color"
        android:textSize="@dimen/d12sp" />

</LinearLayout>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/534800?site
推荐阅读
相关标签
  

闽ICP备14008679号