Android仿淘宝预订日历(18)
作者:逆世风灵
这篇文章主要为大家详细介绍了Android仿淘宝预订日历的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
本文实例为大家分享了Android实现淘宝预订日历的具体代码,供大家参考,具体内容如下
MainActivity.java代码:
package siso.calendarselector; import android.app.Activity; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.EditText; import siso.calendarselector.lib.CalendarSelectorActivity; public class MainActivity extends Activity { private EditText orderEt; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void jump(View v) { EditText et = (EditText) findViewById(R.id.et_input); orderEt = (EditText) findViewById(R.id.et_order); int days = Integer.valueOf(et.getText().toString()); String order = orderEt.getText().toString(); Intent i = new Intent(MainActivity.this, CalendarSelectorActivity.class); i.putExtra(CalendarSelectorActivity.DAYS_OF_SELECT, days); i.putExtra(CalendarSelectorActivity.ORDER_DAY, order); startActivityForResult(i, 1); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 1 && resultCode == RESULT_OK) { String orderInfo = data.getStringExtra(CalendarSelectorActivity.ORDER_DAY); orderEt.setText(orderInfo); /* *****注意***** // 如需转换为Calendar // 正确转换方法(因为2月没有30天): String[] info = orderInfo.split("#"); Calendar c = Calendar.getInstance(); c.set(Integer.valueOf(info[0]), Integer.valueOf(info[1]) - 1, Integer.valueOf(info[2])); // 错误转换方法: c.set(Integer.valueOf(info[0]), Integer.valueOf(info[1]), Integer.valueOf(info[2])); c.add(Calendar.MONTH, -1); **/ } } }
CalendarAdapter.java代码:
package siso.calendarselector.lib; import java.util.ArrayList; import java.util.Calendar; import android.content.Context; import android.graphics.Color; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; import siso.calendarselector.R; /** * @Description 日历表格适配器 */ public class CalendarAdapter extends BaseAdapter { private ArrayList<Day> days; private LayoutInflater mInflater; private Calendar c; private Context context; private String orderDay; public CalendarAdapter(Context context, Calendar c, int passDays, String orderDay) { this.c = c; this.context = context; this.orderDay = orderDay; days = CalendarUtils.getDaysOfMonth(this.c, passDays, orderDay); mInflater = LayoutInflater.from(context); } @Override public int getCount() { return days.size(); } @Override public Day getItem(int arg0) { return days.get(arg0); } @Override public long getItemId(int arg0) { return 0; } @Override public View getView(int arg0, View arg1, ViewGroup arg2) { View v = arg1; ViewHolder holder = null; if (v == null) { v = mInflater.inflate(R.layout.calendar_item, arg2, false); holder = new ViewHolder(); holder.tv = (TextView) v.findViewById(R.id.tv_calendar_item); v.setTag(holder); } else { holder = (ViewHolder) v.getTag(); } Day d = getItem(arg0); switch (d.getType()) { case TODAY: setOrderThreeDayStyle(holder.tv, d.isOrdered(), context.getString(R.string.today)); break; case TOMORROW: setOrderThreeDayStyle(holder.tv, d.isOrdered(), context.getString(R.string.tomorrow)); break; case T_D_A_T: setOrderThreeDayStyle(holder.tv, d.isOrdered(), context.getString(R.string.t_d_a_t)); break; case ENABLE: holder.tv.setText(d.isOrdered() ? d.getName() + context.getString(R.string.order_day) : d.getName()); holder.tv.setEnabled(true); holder.tv.setTextColor(d.isOrdered() ? Color.WHITE : context.getResources().getColor( R.color.calendar_enable_color)); holder.tv.setBackgroundResource(d.isOrdered() ? R.drawable.calendar_order_item_bg : R.drawable.normal_calendar_order_item_bg); holder.tv.setTextSize(d.isOrdered() ? context.getResources().getDimension( R.dimen.calendar_item_order_day_size) : context.getResources().getDimension( R.dimen.calendar_item_nonorder_day_size)); break; case NOT_ENABLE: holder.tv.setText(d.getName()); holder.tv.setEnabled(false); holder.tv.setTextColor(context.getResources().getColor(R.color.calendar_disable_color)); holder.tv.setBackgroundColor(Color.WHITE); holder.tv.setTextSize(context.getResources().getDimension(R.dimen.calendar_item_nonorder_day_size)); break; } return v; } private void setOrderThreeDayStyle(TextView tv, boolean ordered, String dayStr) { tv.setText(ordered ? dayStr + context.getString(R.string.order_day) : dayStr); tv.setEnabled(true); tv.setTextColor(ordered ? Color.WHITE : context.getResources().getColor(R.color.calendar_threeday_color)); tv.setBackgroundResource(ordered ? R.drawable.calendar_order_item_bg : R.drawable.normal_calendar_order_item_bg); tv.setTextSize(ordered ? context.getResources().getDimension(R.dimen.calendar_item_order_day_size) : context .getResources().getDimension(R.dimen.calendar_item_nonorder_day_size)); } static class ViewHolder { TextView tv; } public void previous() { if (c.get(Calendar.MONTH) == c.getActualMinimum(Calendar.MONTH)) { c.set((c.get(Calendar.YEAR) - 1), c.getActualMaximum(Calendar.MONTH), 1); } else { c.set(Calendar.MONTH, c.get(Calendar.MONTH) - 1); } days = CalendarUtils.getDaysOfMonth(c, 0, orderDay); notifyDataSetChanged(); } public void next() { if (c.get(Calendar.MONTH) == c.getActualMaximum(Calendar.MONTH)) { c.set((c.get(Calendar.YEAR) + 1), c.getActualMinimum(Calendar.MONTH), 1); } else { c.set(Calendar.MONTH, c.get(Calendar.MONTH) + 1); } days = CalendarUtils.getDaysOfMonth(c, 0, orderDay); notifyDataSetChanged(); } }
CalendarListAdapter.java代码:
package siso.calendarselector.lib; import java.util.Calendar; import android.content.Context; 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.TextView; import siso.calendarselector.R; /** * @Description 日历列表适配器 */ public class CalendarListAdapter extends BaseAdapter { private Context context; private LayoutInflater mInflater; private int daysOfSelect; private String orderDay; private OnCalendarOrderListener listener; public CalendarListAdapter(Context context, int daysOfSelect, String orderDay) { this.context = context; this.daysOfSelect = daysOfSelect; this.orderDay = orderDay; mInflater = LayoutInflater.from(context); } @Override public int getCount() { return CalendarUtils.throughMonth(Calendar.getInstance(), daysOfSelect) + 1; } @Override public Object getItem(int arg0) { return null; } @Override public long getItemId(int arg0) { return 0; } @Override public View getView(int arg0, View arg1, ViewGroup arg2) { View v = arg1; ViewHolder holder = null; if (v == null) { v = mInflater.inflate(R.layout.calendar, arg2, false); holder = new ViewHolder(); holder.yearAndMonth = (TextView) v.findViewById(R.id.tv_year_month); holder.calendarGrid = (NoScrollGridView) v.findViewById(R.id.gv_calendar_layout); v.setTag(holder); } else { holder = (ViewHolder) v.getTag(); } final Calendar c = Calendar.getInstance(); c.add(Calendar.MONTH, arg0); holder.yearAndMonth.setText(c.get(Calendar.YEAR) + context.getString(R.string.year) + (c.get(Calendar.MONTH) + 1) + context.getString(R.string.month)); CalendarAdapter cAdapter = null; if (arg0 == 0) { cAdapter = new CalendarAdapter(context, c, daysOfSelect, orderDay); } else { int d = daysOfSelect - CalendarUtils.currentMonthRemainDays() - CalendarUtils.getFlowMonthDays(arg0 - 1); cAdapter = new CalendarAdapter(context, c, d, orderDay); } holder.calendarGrid.setAdapter(cAdapter); holder.calendarGrid.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Calendar cl = (Calendar) c.clone(); cl.set(Calendar.DAY_OF_MONTH, 1); int day = position + 2 - cl.get(Calendar.DAY_OF_WEEK); TextView dayTv = (TextView) view.findViewById(R.id.tv_calendar_item); if (day <= 0 || !dayTv.isEnabled()) return; String orderInfo = c.get(Calendar.YEAR) + "#" + (c.get(Calendar.MONTH) + 1) + "#" + day; cl.clear(); cl = null; if (listener != null) listener.onOrder(orderInfo); } }); return v; } static class ViewHolder { TextView yearAndMonth; NoScrollGridView calendarGrid; } public void setOnCalendarOrderListener(OnCalendarOrderListener listener) { this.listener = listener; } public interface OnCalendarOrderListener { void onOrder(String orderInfo); } }
CalendarSelectorActivity.java代码:
package siso.calendarselector.lib; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.widget.ListView; import siso.calendarselector.R; /** * @Description 预订日选择 */ public class CalendarSelectorActivity extends Activity { /** * 可选天数 */ public static final String DAYS_OF_SELECT = "days_of_select"; /** * 上次预订日 */ public static final String ORDER_DAY = "order_day"; private int daysOfSelect; private String orderDay; private ListView listView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.calendar_selector); daysOfSelect = getIntent().getIntExtra(DAYS_OF_SELECT, 30); orderDay = getIntent().getStringExtra(ORDER_DAY); listView = (ListView) findViewById(R.id.lv_calendar); CalendarListAdapter adapter = new CalendarListAdapter(this, daysOfSelect, orderDay); listView.setAdapter(adapter); adapter.setOnCalendarOrderListener(new CalendarListAdapter.OnCalendarOrderListener() { @Override public void onOrder(String orderInfo) { Intent result = new Intent(); result.putExtra(ORDER_DAY, orderInfo); setResult(RESULT_OK, result); finish(); } }); } }
CalendarUtils.java代码:
package siso.calendarselector.lib; import java.util.ArrayList; import java.util.Calendar; public class CalendarUtils { private static int dayOfMonth, monthOfYear, curYear; static { dayOfMonth = Calendar.getInstance().get(Calendar.DAY_OF_MONTH); monthOfYear = Calendar.getInstance().get(Calendar.MONTH); curYear = Calendar.getInstance().get(Calendar.YEAR); } /** * Gets the days in month. * * @param month the month * @param year the year * @return the days in month */ public static int getDaysInMonth(int month, int year) { switch (month) { case Calendar.JANUARY: case Calendar.MARCH: case Calendar.MAY: case Calendar.JULY: case Calendar.AUGUST: case Calendar.OCTOBER: case Calendar.DECEMBER: return 31; case Calendar.APRIL: case Calendar.JUNE: case Calendar.SEPTEMBER: case Calendar.NOVEMBER: return 30; case Calendar.FEBRUARY: return (year % 4 == 0) ? 29 : 28; default: throw new IllegalArgumentException("Invalid Month"); } } /** * Gets the flow month days. * * @param flowMonth the flow month * @return the flow month days */ public static int getFlowMonthDays(int flowMonth) { int totalDays = 0; for (int i = 0; i < flowMonth; i++) { Calendar c = Calendar.getInstance(); c.add(Calendar.MONTH, i + 1); int days = getDaysInMonth(c.get(Calendar.MONTH), c.get(Calendar.YEAR)); totalDays += days; } return totalDays; } /** * Current month remain days. * * @return the int */ public static int currentMonthRemainDays() { Calendar c = Calendar.getInstance(); return getDaysInMonth(c.get(Calendar.MONTH), c.get(Calendar.YEAR)) - c.get(Calendar.DAY_OF_MONTH) + 1; } /** * Through month. * * @param calendar the calendar * @param passDays the pass days * @return the int */ public static int throughMonth(Calendar calendar, int passDays) { Calendar c = (Calendar) calendar.clone(); int curMonth = c.get(Calendar.MONTH); int curYear = c.get(Calendar.YEAR); c.add(Calendar.DAY_OF_MONTH, passDays - 1); int monthCount = (c.get(Calendar.YEAR) - curYear) * 12 + (c.get(Calendar.MONTH) - curMonth); return monthCount; } /** * Gets the days of month. * * @param calendar the calendar * @return the days of month */ public static String[] getDaysOfMonth(Calendar calendar) { Calendar month = (Calendar) calendar.clone(); String[] days; final int FIRST_DAY_OF_WEEK = 0; // Sunday = 0, Monday = 1 month.set(Calendar.DAY_OF_MONTH, 1); int lastDay = month.getActualMaximum(Calendar.DAY_OF_MONTH); int firstDay = (int) month.get(Calendar.DAY_OF_WEEK); if (firstDay == 1) { days = new String[lastDay + (FIRST_DAY_OF_WEEK * 6)]; } else { days = new String[lastDay + firstDay - (FIRST_DAY_OF_WEEK + 1)]; } int j = FIRST_DAY_OF_WEEK; if (firstDay > 1) { for (j = 0; j < firstDay - FIRST_DAY_OF_WEEK; j++) { days[j] = ""; } } else { for (j = 0; j < FIRST_DAY_OF_WEEK * 6; j++) { days[j] = ""; } j = FIRST_DAY_OF_WEEK * 6 + 1; // sunday => 1, monday => 7 } int dayNumber = 1; for (int i = j - 1; i < days.length; i++) { days[i] = "" + dayNumber; dayNumber++; } return days; } /** * Gets the days of month. * * @param calendar the calendar * @param passDays the pass days * @param orderDay the order day * @return the days of month */ public static ArrayList<Day> getDaysOfMonth(Calendar calendar, int passDays, String orderDay) { String[] orderInfo = null; boolean isOrdered = false; if (orderDay != null) orderInfo = orderDay.split("#"); Calendar month = (Calendar) calendar.clone(); final int FIRST_DAY_OF_WEEK = 0; // Sunday = 0, Monday = 1 month.set(Calendar.DAY_OF_MONTH, 1); int lastDay = month.getActualMaximum(Calendar.DAY_OF_MONTH); int firstDay = (int) month.get(Calendar.DAY_OF_WEEK); ArrayList<Day> days = new ArrayList<Day>(); int size; if (firstDay == 1) { size = lastDay + (FIRST_DAY_OF_WEEK * 6); } else { size = lastDay + firstDay - (FIRST_DAY_OF_WEEK + 1); } for (int i = 0; i < size; i++) { days.add(new Day("", Day.DayType.NOT_ENABLE, isOrdered)); } int j = FIRST_DAY_OF_WEEK; if (firstDay > 1) { for (j = 0; j < firstDay - FIRST_DAY_OF_WEEK; j++) { days.set(j, new Day("", Day.DayType.NOT_ENABLE, isOrdered)); } } else { for (j = 0; j < FIRST_DAY_OF_WEEK * 6; j++) { days.set(j, new Day("", Day.DayType.NOT_ENABLE, isOrdered)); } j = FIRST_DAY_OF_WEEK * 6 + 1; // sunday => 1, monday => 7 } int dayNumber = 1; for (int i = j - 1; i < days.size(); i++) { Day.DayType type; if (month.get(Calendar.YEAR) == curYear && month.get(Calendar.MONTH) == monthOfYear) { if (dayNumber >= dayOfMonth && dayNumber < dayOfMonth + passDays) { type = Day.DayType.ENABLE; if (dayNumber == dayOfMonth) { type = Day.DayType.TODAY; if (orderDay == null) { isOrdered = true; } else { isOrdered = false; } } else if (dayNumber == dayOfMonth + 1) { type = Day.DayType.TOMORROW; } else if (dayNumber == dayOfMonth + 2) { type = Day.DayType.T_D_A_T; } } else { type = Day.DayType.NOT_ENABLE; } } else { if (dayNumber <= passDays) { type = Day.DayType.ENABLE; // 明天/后天在下个月 int remainDays = getDaysInMonth(monthOfYear, curYear) - dayOfMonth; if (remainDays < 2 && dayNumber <= 2 && Math.abs(month.get(Calendar.MONTH) - monthOfYear) == 1 && month.get(Calendar.YEAR) == curYear) { if (remainDays == 1) { if (dayNumber == 1) { type = Day.DayType.T_D_A_T; } } else if (remainDays == 0) { if (dayNumber == 1) { type = Day.DayType.TOMORROW; } else if (dayNumber == 2) { type = Day.DayType.T_D_A_T; } } } } else { type = Day.DayType.NOT_ENABLE; } } if (orderInfo != null && orderInfo.length == 3 && Integer.valueOf(orderInfo[0]) == month.get(Calendar.YEAR) && Integer.valueOf(orderInfo[1]) == (month.get(Calendar.MONTH) + 1) && Integer.valueOf(orderInfo[2]) == dayNumber) { isOrdered = true; } else { isOrdered = false; } days.set(i, new Day("" + dayNumber, type, isOrdered)); dayNumber++; } return days; } }
Day.java代码:
package siso.calendarselector.lib; public class Day { public Day(String name, DayType type, boolean isOrdered) { setName(name); setType(type); setOrdered(isOrdered); } public enum DayType { TODAY, TOMORROW, T_D_A_T, ENABLE, NOT_ENABLE } private String name; private DayType type; private boolean isOrdered; public boolean isOrdered() { return isOrdered; } public void setOrdered(boolean isOrdered) { this.isOrdered = isOrdered; } public String getName() { return name; } public void setName(String name) { this.name = name; } public DayType getType() { return type; } public void setType(DayType type) { this.type = type; } }
NoScrollGridView.java代码:
package siso.calendarselector.lib; import android.content.Context; import android.util.AttributeSet; import android.widget.GridView; public class NoScrollGridView extends GridView { public NoScrollGridView(Context context) { super(context); } public NoScrollGridView(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); } }
AndroidManifest.xml内容:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:ndroid="http://schemas.android.com/apk/res-auto" package="siso.calendarselector"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" ndroid:theme="@android:style/Theme.Black.NoTitleBar"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="siso.calendarselector.lib.CalendarSelectorActivity"> </activity> </application> </manifest>
项目运行结果如图:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。