Android自定义日历

来源:互联网 发布:淘宝网雪纺女装 编辑:程序博客网 时间:2024/05/21 22:47

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;        }    }}
原创粉丝点击