漂亮的自定义日历控件(修改版)

来源:互联网 发布:qq营销软件 编辑:程序博客网 时间:2024/04/29 11:07


效果图



package com.teekart.app.travel;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import java.util.List;import android.annotation.SuppressLint;import android.app.Activity;import android.app.AlertDialog;import android.content.DialogInterface;import android.content.Intent;import android.os.Bundle;import android.text.TextUtils;import android.view.View;import android.view.Window;import android.view.View.OnClickListener;import android.view.ViewGroup.LayoutParams;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.TextView;import android.widget.Toast;import com.teekart.app.BaseActivity;import com.teekart.app.R;import com.teekart.app.beans.Travel_detail_Info.PriceList;import com.teekart.app.calandar.CalendarMoney;import com.teekart.app.calandar.MyCalendar;import com.teekart.app.calandar.MyCalendar.OnDaySelectListener;import com.teekart.util.Utils;/** *  * @author king * */@SuppressLint("SimpleDateFormat")public class Canlader4TravelNewActivity extends BaseActivity implements OnDaySelectListener{LinearLayout ll; MyCalendar c1; Date date; String nowday; long nd = 1000*24L*60L*60L;//一天的毫秒数 SimpleDateFormat simpleDateFormat,sd1,sd2;// SharedPreferences sp;// Editor editor;  private String inday,outday,sp_inday,sp_outday;private ImageView iv_back;private TextView tv_title;private int money;private int bookRecentDay;private ArrayList<PriceList> priceList;      @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        requestWindowFeature(Window.FEATURE_NO_TITLE);        setContentView(R.layout.comm_calendar_main);        initTitle();    if (savedInstanceState != null) {getSaveData(savedInstanceState);} else {Intent intent = getIntent();money=intent.getIntExtra("money", 0);bookRecentDay=intent.getIntExtra("bookRecentDay", 0);//最近可预订的天数priceList=(ArrayList<PriceList>)intent.getSerializableExtra("priceList");//TeeTimeListTime =intent.getStringExtra("TeeTimeListTime");//最近可预订的天数}                simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd");        nowday=simpleDateFormat.format(new Date());sd1=new SimpleDateFormat("yyyy");sd2=new SimpleDateFormat("dd");        ll=(LinearLayout) findViewById(R.id.ll);        init();    }        @Overrideprotected void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);outState.putInt("money", money);outState.putInt("bookRecentDay", bookRecentDay);outState.putSerializable("priceList", priceList);}@Overrideprotected void onRestoreInstanceState(Bundle savedInstanceState) {super.onRestoreInstanceState(savedInstanceState);if (savedInstanceState != null) {getSaveData(savedInstanceState);}}private void getSaveData(Bundle savedInstanceState) {money=savedInstanceState.getInt("money", 0);bookRecentDay=savedInstanceState.getInt("bookRecentDay", 0);priceList=(ArrayList<PriceList>) savedInstanceState.getSerializable("priceList");}        /** * 设置标题的内容 */private void initTitle() {iv_back = (ImageView) findViewById(R.id.iv_back);tv_title = (TextView) findViewById(R.id.tv_title);iv_back.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {finish();}});tv_title.setText("请选择出行日期");}        private void init(){    List<String> listDate=getDateList();        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);        for(int i=0;i<listDate.size();i++){//king 这里添加几个月份        c1 = new MyCalendar(this);            c1.setLayoutParams(params);            Date date=null;            try {        date=simpleDateFormat.parse(listDate.get(i));    } catch (ParseException e) {    e.printStackTrace();    }            if(!"".equals(sp_inday)){            c1.setInDay(sp_inday);            }            if(!"".equals(sp_outday)){            c1.setOutDay(sp_outday);            }            c1.setMoney(priceList);            c1.setTheDay(date);            c1.setOnDaySelectListener(this);            ll.addView(c1);        }    }    //点击事件@Overridepublic void onDaySelectListener(View view, String date) {//Toast.makeText(this, date, 0).show();Boolean isIn = false;// true代表选择日期是否存在for (int j = 0; j < priceList.size(); j++) {if (date.equals(priceList.get(j).travelDate)) {isIn=true;Intent intent = new Intent();intent.putExtra("travelDateStr", priceList.get(j).travelDateStr);intent.putExtra("travelDate", priceList.get(j).travelDate);intent.putExtra("price", priceList.get(j).totalPrice);setResult(RESULT_OK, intent);finish();}}if (!isIn) {showAlertDialog();// 拨打客服咨询}}//根据当前日期,向后数三个月(若当前day不是1号,为满足至少90天,则需要向后数4个月)@SuppressLint("SimpleDateFormat")public List<String> getDateList(){List<String> list=new ArrayList<String>();Date date=new Date();int nowMon=date.getMonth()+1;//当前月份String yyyy=sd1.format(date);//当前年份String dd=sd2.format(date);//当前日期if(nowMon==9){list.add(simpleDateFormat.format(date));list.add(yyyy+"-10-"+dd);if(!dd.equals("01")){list.add(yyyy+"-11-"+dd);}}else if(nowMon==10){list.add(yyyy+"-10-"+dd);list.add(yyyy+"-11-"+dd);if(!dd.equals("01")){list.add(yyyy+"-12-"+dd);}}else if(nowMon==11){list.add(yyyy+"-11-"+dd);list.add(yyyy+"-12-"+dd);if(!dd.equals("01")){list.add((Integer.parseInt(yyyy)+1)+"-01-"+dd);}}else if(nowMon==12){list.add(yyyy+"-12-"+dd);list.add((Integer.parseInt(yyyy)+1)+"-01-"+dd);if(!dd.equals("01")){list.add((Integer.parseInt(yyyy)+1)+"-02-"+dd);}}else{list.add(yyyy+"-"+getMon(nowMon)+"-"+dd);list.add(yyyy+"-"+getMon((nowMon+1))+"-"+dd);if(!dd.equals("01")){list.add(yyyy+"-"+getMon((nowMon+2))+"-"+dd);}}return list;}public String getMon(int mon){String month="";if(mon<10){month="0"+mon;}else{month=""+mon;}return month;}private void showAlertDialog() {AlertDialog.Builder builder = new AlertDialog.Builder(Canlader4TravelNewActivity.this);String noTeetimeTips="";noTeetimeTips="当前日期没有旅游套餐,拨打我们的咨询电话?";builder.setTitle("温馨提示").setMessage(noTeetimeTips).setNeutralButton("立即咨询",new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int id) {Utils.phone(Canlader4TravelNewActivity.this,Utils.phoneNum);}}).setPositiveButton("取消", new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int id) {dialog.cancel();}});AlertDialog alert = builder.create();alert.show();}}





package com.teekart.app.calandar;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Calendar;import java.util.Date;import java.util.List;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.AdapterView.OnItemClickListener;import android.widget.BaseAdapter;import android.widget.LinearLayout;import android.widget.TextView;import com.teekart.app.R;import com.teekart.app.beans.Travel_detail_Info.PriceList;/** * * @author king * */public class MyCalendar extends LinearLayout {    private static Context context;    private Date theInDay;    private String inday="",outday="";    public static View viewIn;    public static View viewOut;    public static String positionIn;    public static String positionOut;    static long nd = 1000*24L*60L*60L;//一天的毫秒数    private  List<String> gvList ;//存放天    private OnDaySelectListener callBack;//回调函数    private static String nowday= new SimpleDateFormat("yyyy-MM-dd").format(new Date()) ;    private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMM");//日期格式化    private ArrayList<PriceList> calendarMoneys;    private static SimpleDateFormat dateFormat2 = new SimpleDateFormat("yyyy-MM-dd");//日期格式化    /**     * 构造函数     * @param context     */    public MyCalendar(Context context) {        super(context);        MyCalendar.context = context;    }    /**     * 构造函数     * @param context     */    public MyCalendar(Context context, AttributeSet attrs) {        super(context, attrs);        MyCalendar.context = context;    }    public void setInDay(String inday){        this.inday=inday;    }    public void setOutDay(String outday){        this.outday=outday;    }    public void setTheDay(Date dateIn){        this.theInDay=dateIn;        init();    }    public void setMoney(ArrayList<PriceList> calendarMoneys){        this.calendarMoneys=calendarMoneys;    }    /**     * 初始化日期以及view等控件     */    private void init() {        gvList = new ArrayList<String>();//存放天        final Calendar cal = Calendar.getInstance();//获取日历实例        cal.setTime(theInDay);//cal设置为当天的        cal.set(Calendar.DATE, 1);//cal设置当前day为当前月第一天        int tempSum = countNeedHowMuchEmpety(cal);//获取当前月第一天为星期几        int dayNumInMonth = getDayNumInMonth(cal);//获取当前月有多少天        setGvListData(tempSum, dayNumInMonth,cal.get(Calendar.YEAR)+"-"+getMonth((cal.get(Calendar.MONTH)+1)));        View view = LayoutInflater.from(context).inflate(R.layout.comm_calendar, this, true);//获取布局,开始初始化        TextView tv_year= (TextView) view.findViewById(R.id.tv_year);        if(cal.get(Calendar.YEAR)>new Date().getYear()){            tv_year.setVisibility(View.VISIBLE);            tv_year.setText(cal.get(Calendar.YEAR)+"年");        }        TextView tv_month= (TextView) view.findViewById(R.id.tv_month);        tv_month.setText(String.valueOf(theInDay.getMonth()+1));        MyGridView gv = (MyGridView) view.findViewById(R.id.gv_calendar);        calendarGridViewAdapter gridViewAdapter = new calendarGridViewAdapter(gvList,inday,outday);        gridViewAdapter.setMoney(calendarMoneys);        gv.setAdapter(gridViewAdapter);        gv.setOnItemClickListener(new OnItemClickListener() {            @Override            public void onItemClick(AdapterView<?> adapterView, View arg1,int position, long arg3) {                String choiceDay = (String) adapterView.getAdapter().getItem(position);                String[] date=choiceDay.split(",");                String day=date[1];                if (!" ".equals(day)) {                    if (Integer.parseInt(day) < 10) {                        day = "0" + date[1];                    }                    choiceDay = date[0] +"-"+ day;                    if (callBack != null) {//调用回调函数回调数据                        callBack.onDaySelectListener(arg1,choiceDay);                    }                }            }        });    }    /**     * 为gridview中添加需要展示的数据     * @param tempSum     * @param dayNumInMonth     */    private void setGvListData(int tempSum, int dayNumInMonth,String YM) {        gvList.clear();        for (int i = 0; i < tempSum; i++) {            gvList.add(" , ");        }        for (int j = 1; j <= dayNumInMonth; j++) {            gvList.add(YM+","+String.valueOf(j));        }    }    private String getMonth(int month) {        String mon="";        if(month<10){            mon="0"+month;        }else{            mon=""+month;        }        return mon;    }    /**     * 获取当前月的总共天数     * @param cal     * @return     */    private int getDayNumInMonth(Calendar cal) {        return cal.getActualMaximum(Calendar.DATE);    }    /**     * 获取当前月第一天在第一个礼拜的第几天,得出第一天是星期几     * @param cal     * @return     */    private int countNeedHowMuchEmpety(Calendar cal) {        int firstDayInWeek = cal.get(Calendar.DAY_OF_WEEK) - 1;        return firstDayInWeek;    }    /**     * gridview中adapter的viewholder     * @author Administrator     *     */    static class GrideViewHolder {        TextView tvDay,tv;    }    /**     * gridview的adapter     * @author Administrator     *     */    static class calendarGridViewAdapter extends BaseAdapter {        List<String> gvList ;//存放天        String inday,outday;        //    private String moneyStr;//    private String bookRecentDay;        private ArrayList<PriceList> calendarMoneys;        public calendarGridViewAdapter(List<String> gvList,String inday,String outday){            super();            this.gvList=gvList;            this.inday=inday;            this.outday=outday;        }        public void setMoney(ArrayList<PriceList> calendarMoneys){            this.calendarMoneys=calendarMoneys;        }        @Override        public int getCount() {            return gvList.size();        }        @Override        public String getItem(int position) {            return gvList.get(position);        }        @Override        public long getItemId(int position) {            return position;        }        @Override        public View getView(int position, View convertView, ViewGroup parent) {            GrideViewHolder holder;            if (convertView == null) {                holder = new GrideViewHolder();                convertView = inflate(context,R.layout.common_calendar_gridview_item, null);                holder.tv = (TextView) convertView.findViewById(R.id.tv_calendar);                holder.tvDay = (TextView) convertView.findViewById(R.id.tv_calendar_day);                convertView.setTag(holder);            } else {                holder = (GrideViewHolder) convertView.getTag();            }            String[] date=getItem(position).split(",");            holder.tvDay.setText(date[1]);            String s = date[1];            String calshowdate;            if(s.getBytes().length==1){                calshowdate = date[0]+"-0"+date[1];            }else{                calshowdate = date[0]+"-"+date[1];            }            for (int i = 0; i < calendarMoneys.size(); i++) {                if (calshowdate.equals(calendarMoneys.get(i).travelDate)) {                    holder.tv.setText("¥" + calendarMoneys.get(i).totalPrice);                }            }            if((position+1)%7==0||(position)%7==0){                //修改周末的颜色//            holder.tvDay.setTextColor(Color.parseColor("#339900"));            }            if(!date[1].equals(" ")){                String day=date[1];                if(Integer.parseInt(date[1])<10){                    day="0"+date[1];                }                if((date[0]+"-"+day).equals(nowday)){                    holder.tvDay.setTextColor(Color.parseColor("#ff8d00"));                    holder.tvDay.setTextSize(15);                    holder.tvDay.setText("今天");                }//                 if(!"".equals(inday)&&(date[0]+"-"+day).equals(inday)){//                 convertView.setBackgroundColor(Color.parseColor("#33B5E5"));//                 holder.tvDay.setTextColor(Color.WHITE);//                 holder.tvDay.setText(date[1]);//                 holder.tv.setText("入住");//                 viewIn=convertView;//                 positionIn=date[1];//                 }//                 if(!"".equals(outday)&&(date[0]+"-"+day).equals(outday)){//                 convertView.setBackgroundColor(Color.parseColor("#33B5E5"));//                 holder.tvDay.setTextColor(Color.WHITE);//                 holder.tvDay.setText(date[1]);//                 holder.tv.setText("离开");//                 viewOut=convertView;//                 positionOut=date[1];//                 }                try {                    //若日历日期<当前日期,则不能选择                    if(dateFormat2.parse(date[0]+"-"+day).getTime()<dateFormat2.parse(nowday).getTime()){                        holder.tvDay.setTextColor(Color.parseColor("#999999"));                    }                    //若日历日期-当前日期>60天,则不能选择                    long dayxc=(dateFormat2.parse(date[0]+"-"+day).getTime()-dateFormat2.parse(nowday).getTime())/nd;                    if(dayxc>60){                        holder.tvDay.setTextColor(Color.parseColor("#999999"));                    }                } catch (ParseException e) {                    e.printStackTrace();                }            }            return convertView;        }    }    /**     * 自定义监听接口     * @author Administrator     *     */    public interface OnDaySelectListener {        void onDaySelectListener(View view,String date);    }    /**     * 自定义监听接口设置对象     * @param o     */    public void setOnDaySelectListener(OnDaySelectListener o) {        callBack = o;    }}







0 0
原创粉丝点击