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;
}
}
}