Android自定义日历

1.自定义控件基于系统控件上改进
2.类继承布局或者基础控件进行自定义
3.去到Main的布局中去绑定视图,
4.对象的克隆的内存与源对象的内存是相同的
5.LayoutInflater inflater=LayoutInflater.from(context);
inflater.inflate(R.layout.calerdar_view,this);
绑定自定义布局

public class NewCalerdar extends LinearLayout {
    private TextView top_tv;
    private ImageView top_pre;
    private ImageView top_next;
    private GridView week_grid;
    private Calendar data= Calendar.getInstance();
    public NewCalerdar(Context context) {
        super(context);
        //initControl(context);
    }

    /**
     * 后两个方法调用initControl,绑定布局
     * @param context
     * @param attrs
     */

    public NewCalerdar(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        initControl(context);
    }

    public NewCalerdar(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initControl(context);
    }

    private void initControl(Context context) {
        blindControl(context);//绑定视图及UI控件
        blindControlEvent();//点击事件
        renderCanlendar();//渲染日历
    }

    private void blindControlEvent() {
        top_pre.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                data.add(Calendar.MONTH,-1);
                renderCanlendar();
            }
        });
        top_next.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                data.add(Calendar.MONTH,1);
                renderCanlendar();
            }
        });
    }

    private void blindControl(Context context) {
        /**
         * 绑定布局
         */
        LayoutInflater inflater=LayoutInflater.from(context);
        inflater.inflate(R.layout.calerdar_view,this);
        top_tv=findViewById(R.id.top_data);
        top_pre=findViewById(R.id.top_pre);
        top_next=findViewById(R.id.top_next);
        week_grid=findViewById(R.id.canlendar_grid);
    }
    private void renderCanlendar() {
        /**
         * SimpleDateFormat("MMM FF");
         * 格式化日期,输出的数据是(2016 05)
         */
        SimpleDateFormat sdf=new SimpleDateFormat("MMM FF");
        /**
         * Format是CString类的一个成员函数,它通过格式操作使任意类型的数据转换成一个字符串。
         * Format参数也是一个格式化字符串。DateTime是时间类型。返回值是一种格式化后的字符串。
         */
        top_tv.setText(sdf.format(data.getTime()));
        ArrayList<Date> cells=new ArrayList<>();
        /**
         * 时间类克隆
         * clone在第一步是和new相似的, 都是分配内存,调用clone方法时,分配的内存和源对象(即调用clone方法的对象)相同,
         * 然后再使用原对象中对应的各个域,填充新对象的域, 填充完成之后,clone方法返回,一个新的相同的对象被创建,同样可以把这个新对象的引用发布到外部。
         */
        Calendar calendar= (Calendar) data.clone();
        calendar.set(Calendar.DAY_OF_MONTH,1);
        int preDays=calendar.get(Calendar.DAY_OF_WEEK)-1;
        calendar.add(Calendar.DAY_OF_MONTH,-preDays);
        int maxCellCount=6*7;
        while(cells.size()<maxCellCount){
            cells.add(calendar.getTime());
            calendar.add(calendar.DAY_OF_MONTH,1);
        }
        /**
         * 给GridView绑定适配器,并给适配器传入数据源
         */
        week_grid.setAdapter(new CalendarAdapter(getContext(),cells));
    }
    private class CalendarAdapter extends ArrayAdapter<Date>{
        LayoutInflater inflater;
        public CalendarAdapter(@NonNull Context context, ArrayList<Date> days) {
            super(context, R.layout.calendar_text_day,days);
            inflater=LayoutInflater.from(context);
            //Toast.makeText(getContext(), "666", Toast.LENGTH_SHORT).show();
        }

        /**
         * 传替视图的类
         * @param position
         * @param convertView
         * @param parent
         * @return
         */
        public View getView(int position,View convertView,ViewGroup parent) {
            Date date=getItem(position);
            /**
             * 判断convertView 是否为空,空则绑定视图
             */
            if (convertView==null){
                convertView=inflater.inflate(R.layout.calendar_text_day,parent,false);
            }
            int day=date.getDate();
            ((TextView)convertView).setText(String.valueOf(day));
            /*Calendar calendar= (Calendar) data.clone();
            calendar.set(Calendar.DAY_OF_MONTH,1);
            int daysInMonth=calendar.getActualMaximum(calendar.DATE);*/
            Date now=new Date();
            boolean isTheSameMonth=false;
            if(date.getMonth()==now.getMonth()){
                isTheSameMonth=true;
            }
            if(isTheSameMonth){
                /**
                 * 给月份的所有数据改变颜色
                 */
                ((TextView) convertView).setTextColor(Color.parseColor("#000000"));

            }else{
                ((TextView) convertView).setTextColor(Color.parseColor("#666666"));

            }

            if (now.getDate()==date.getDate()&&now.getMonth()==date.getMonth()&&
                    now.getYear()==date.getYear()){
                ((TextView) convertView).setTextColor(Color.parseColor("#ff0000"));
                ((Calendar_day_textview) convertView).isToday=true;
            }

            return convertView;
        }
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_37543460/article/details/78300030