您的位置:首页 > 移动开发 > Android开发

[置顶] Aandroid日历Dialog

2016-05-24 14:29 615 查看
Dialog效果图:







我们一步一步来实现上面的效果



第一步:先实现如上图的效果

分析

1.要有一个操作日期的工具类(Utils)  此类主要功能  当前日期月份的最大天数 日期月份的1号数星期几?  日期的上一个月最大天数

  2. 通过Utils 获取 lastDates contentDates nextDates 三个日期数据集合

3. 创建GridView实例 显示
lastDates contentDates nextDates 三个日期数据集合

GridViewAdapter 源码如下:

public class DateGridViewAdapter extends BaseAdapter {

public static final String MONDAY = "周一";
public static final String TUESDAY = "周二";
public static final String WEDNESDAY = "周三";
public static final String THURSDAY = "周四";
public static final String FRIDAY = "周五";
public static final String SATURDAY = "周六";
public static final String SUNDAY = "周日";
private Context context;

private String date;// 日期字符串 日期格式:yyyy-MM-dd

private int MAXday;// 日期月份一共有多少天

private int TopMAXday;// 日期月份上一个月一共有多少天

private int ItemCount = 42;// GridView Item个数

private ArrayList<String> lastDates;// 当前日期月份之前一个月
private ArrayList<String> contenDates;// 当前日期月份
private ArrayList<String> nextDates;// 当前日期月份之后一个月

/**
* @param date
*            当传递过来的date为null时 则使用当前时间
* @param remindDate
*            所需要提醒的时间集合
*
*/
public DateGridViewAdapter(Context context, String date) {
this.context = context;
if (date == null) {
this.date = Utils.getDate();
} else if (Utils.isValidDate(date)) {
this.date = date;
}
initialization();
}
/**
* 初始化日期数据
*/
private void initialization() {
MAXday = Utils.getDayOfMonth(getDate());
TopMAXday = Utils.getTopDayOfMonth(getDate());
setData();
}
/**
* 设置日期数据
*/
private void setData() {
contenDates = new ArrayList<>();
nextDates = new ArrayList<>();
lastDates = new ArrayList<>();
switch (Utils.getWeek(this.date)) {
case MONDAY: // 周一
addData(lastDates, TopMAXday, TopMAXday);
addData(contenDates, MAXday);
addData(nextDates, ItemCount - MAXday - 1);
break;
case TUESDAY: // 周二
addData(lastDates, TopMAXday - 1, TopMAXday);
addData(contenDates, MAXday);
addData(nextDates, ItemCount - MAXday - 2);
break;
case WEDNESDAY:// 周三
addData(lastDates, TopMAXday - 2, TopMAXday);
addData(contenDates, MAXday);
addData(nextDates, ItemCount - MAXday - 3);
break;
case THURSDAY:// 周四
addData(lastDates, TopMAXday - 3, TopMAXday);
addData(contenDates, MAXday);
addData(nextDates, ItemCount - MAXday - 4);
break;
c
4000
ase FRIDAY:// 周五
addData(lastDates, TopMAXday - 4, TopMAXday);
addData(contenDates, MAXday);
addData(nextDates, ItemCount - MAXday - 5);
break;
case SATURDAY:// 周六
addData(lastDates, TopMAXday - 5, TopMAXday);
addData(contenDates, MAXday);
addData(nextDates, ItemCount - MAXday - 6);
break;
case SUNDAY:// 周日
addData(contenDates, MAXday);
addData(nextDates, ItemCount - MAXday);
break;
}
}

private void addData(ArrayList<String> list, int i, int count) {
for (int j = i; j <= count; j++) {
list.add(j + "");
}
}

private void addData(ArrayList<String> list, int count) {
for (int i = 1; i <= count; i++) {
list.add(i + "");
}
}

@Override
public int getCount() {
return contenDates.size() + nextDates.size() + lastDates.size();
}

@Override
public Object getItem(int position) {
if (lastDates.size() != 0 && position < lastDates.size()) {
return lastDates.get(position);
} else if (nextDates.size() != 0 && position > lastDates.size() + contenDates.size() - 1) {

return nextDates.get(position);
} else {
return contenDates.get(position);
}
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
TextView tv = null;
if (convertView == null) {
AbsListView.LayoutParams lp = new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT,
Utils.dip2px(context, 40));
tv = new TextView(context);
tv.setLayoutParams(lp);
convertView = tv;
} else {
tv = (TextView) convertView;
}
// 上一个月
if (lastDates.size() != 0 && position < lastDates.size()) {
tv.setTextColor(Color.parseColor("#bfbfbf"));
tv.setText(lastDates.get(position));
}
// 下一个月
else if (nextDates.size() != 0 && position > lastDates.size() + contenDates.size() - 1) {
tv.setText(nextDates.get(position - lastDates.size() - contenDates.size()));
tv.setTextColor(Color.parseColor("#bfbfbf"));
}
// 当月
else {
tv.setText(contenDates.get(position - lastDates.size()));
tv.setTextColor(Color.parseColor("#000000"));
}
return tv;
}
}


Utils 源码:

public class Utils {
public static final int TYPR_NEXT = 0;// 下一个月

public static final int TYPR_LAST = 1;// 上一个月

/**
* 根据手机的分辨率从 px(像素) 的单位 转成为 dp
*/
public static int px2dip(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}

/**
* 根据手机的分辨率从 dp(像素) 的单位 转成为 px
*/
public static int dip2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}

/**
* @param date
*            日期字符串 传入的日期字符串格式 :"年-月-日"
* @return 返回日期月份的1号是星期几?
*/
public static String getWeek(String date) {
Calendar calendar = Calendar.getInstance(Locale.CHINA);
calendar.setTime(new Date(getMillisecond(date)));
calendar.set(Calendar.DAY_OF_MONTH, 1);
SimpleDateFormat format = new SimpleDateFormat("E");
return format.format(calendar.getTime());

}

/**
* @return 返回系统当前时间的日期字符串 "年-月-日"
*/
public static String getDate() {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
return df.format(new Date());
}
/**
* @param date
*            根据传入日期字符串 date 传入的日期字符串格式 :"年-月-日"
*
* @param type
*            {@link #TYPR_LAST }上一个月
*            <p>
*            {@link #TYPR_NEXT}下一个月
*
* @return 返回下一月或上一个月的日期字符串
*/
public static String getNewDate(String date, int type) {
String formatDate = getDate(getMillisecond(date));

String year = formatDate.substring(0, 4);
String day = formatDate.substring(8, formatDate.length());
String month = formatDate.substring(5, 7);

int intYear = Integer.valueOf(year);
int intMonth = Integer.valueOf(month);
month = "";
if (type == TYPR_LAST) {
if (intMonth > 1) {
month = String.valueOf((intMonth - 1));
} else {
year = "";
month = "12";
year = String.valueOf((intYear - 1));
}
} else {
if (intMonth == 12) {
year = "";
month = "1";
year = String.valueOf((intYear + 1));
} else {
month = String.valueOf((intMonth + 1));
}
}
String NewDate = year + "-" + month + "-" + day;
return getDate(getMillisecond(NewDate));
}

/**
* @param date
*            日期字符串 传入的日期字符串格式 :"年-月-日"
* @return 返回日期上一个月 月份的最大天数
*
*
*/
public static int getTopDayOfMonth(String date) {
String NewDate = getNewDate(date, TYPR_LAST);
return getDayOfMonth(NewDate);
}

/**
* @param date
*            日期字符串 传入的日期字符串格式 :"年-月-日"
* @return 返回日期月份的最大天数
*/
public static int getDayOfMonth(String date) {

Calendar aCalendar = Calendar.getInstance(Locale.CHINA);
aCalendar.setTime(new Date(getMillisecond(date)));
int day = aCalendar.getActualMaximum(Calendar.DATE);
return day;
}

/**
* @param date
*            日期字符串 传入的日期字符串格式 :"年-月-日"
* @return 返回日期的毫秒值
*/
public static long getMillisecond(String date) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date d = null;
try {
d = sdf.parse(date);
} catch (ParseException e) {
e.printStackTrace();
}
return d.getTime();
}

/**
* @param millisecond
*            毫秒值
* @return 返回一个日期格式为 yyyy-MM-dd 的字符串 "年-月-日"
*/
public static String getDate(Long millisecond) {
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(millisecond);

return formatter.format(calendar.getTime());
}

/**
* @param date
*            判断日期格式是否是 yyyy-MM-dd "年-月-日"
* @return 如果不是则返回 fase
*/
public static boolean isValidDate(String date) {
boolean convertSuccess = true;
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
try {
// 设置lenient为false.
// 否则SimpleDateFormat会比较宽松地验证日期,比如2007/02/29会被接受,并转换成2007/03/01
format.setLenient(false);
format.parse(date);
} catch (ParseException e) {
// e.printStackTrace();
// 如果throw java.text.ParseException或者NullPointerException,就说明格式不对
convertSuccess = false;
}
return convertSuccess;
}

}
到此初始效果已经实现了 .....................
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: