我的Android案例签到日历


2015年的Android案例之旅

案例八:签到日历

知识点:

GridView的使用SQLite的使用

涉及文件:

res->layout->activity_main.xml 主布局文件res->layout->date.xml 布局文件src->db->DBHelper.java java文件src->db->SignDAO.java java文件src->activity->MainActivity.java java文件

activity_main.xml
 
01. <!-- 线性布局 -->
02. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
03. android:layout_height="match_parent"
04. android:layout_width="match_parent"
05. android:orientation="vertical">
06. <!-- 文本控件
07. 显示当前月份 -->
08. <TextView
09. android:id="@+id/show"
10. android:gravity="center"
11. android:layout_width="match_parent"
12. android:layout_height="wrap_content"
13. android:text="月份"/>
14. <!-- 网格视图
15. -->
16. <GridView
17. android:id="@+id/myDate"
18. android:layout_width="match_parent"
19. android:layout_height="355dp"
20. android:numColumns="7"></GridView>
21. <Button
22. android:id="@+id/sign"
23. android:layout_width="match_parent"
24. android:layout_height="wrap_content"
25. android:text="签到"/>
26. </LinearLayout>

date.xml

01. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
02. android:layout_width="match_parent"
03. android:layout_height="match_parent"
04. android:orientation="vertical">
05.  
06. <TextView
07. android:id="@+id/txtWeekDateMB"
08. android:layout_width="wrap_content"
09. android:layout_height="wrap_content"
10. android:layout_marginLeft="10dp"
11. android:layout_marginTop="10dp"
12. android:visibility="gone" />
13.  
14. <TextView
15. android:id="@+id/txtDayDateMB"
16. android:layout_width="wrap_content"
17. android:layout_height="wrap_content"
18. android:layout_marginLeft="10dp"
19. android:layout_marginTop="10dp" />
20. </LinearLayout>

MainActivity.java

001. public class MainActivity extends Activity {
002. //Log标签
003. private static final String TAG = "SIGN";
004. //声明对象
005. private Button sign;
006. private TextView show;
007. private GridView myDate;
008. //获取本地时间
009. Time nowTime = new Time();
010. //一个月内的天数
011. private int dayMaxNum;
012. private int year,month,day,ym;
013. private SignDAO sdao;
014. //查询结果
015. private List<String> list = new ArrayList<String>();
016. private ArrayList<HashMap<String, Object>> sinalist,alisttmp;
017. @SuppressLint("NewApi")
018. @Override
019. protected void onCreate(Bundle savedInstanceState) {
020. super.onCreate(savedInstanceState);
021. setContentView(R.layout.activity_main);
022. Log.i(TAG, "SIGN is onCreate");
023.  
024. //初始化对象
025. init();
026. //初始化数据库信息
027. initdata();
028.  
029. myDate.setOnItemClickListener(new OnItemClickListener(){
030.  
031. @Override
032. public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
033. long arg3) {
034. //判断是否已经签到 从服务器获取签到信息
035. //模拟从本地数据库获取信息
036. if(day==arg2+1)//只能当天签到
037. {
038. sinalist = sdao.findSinInfo("zhangsan",year+"-"+month+"-"+(arg2+1),"0");
039. if(sinalist.size()>0)
040. {
041. Toast.makeText(getApplicationContext(), "已经签过到不能重复签到"200).show();
042. Log.d("""已签到");
043. }
044. else
045. {
046. //在数据库插入一条数据
047. sdao.insertSinInfo("zhangsan""张三", year+"-"+month+"-"+(arg2+1),year+""+month);
048. initdata();
049. }
050. }
051.  
052. }
053. });
054. }
055.  
056. /**
057. * @param   初始化对象
058. */
059. private void init(){
060. sign = (Button)this.findViewById(R.id.sign);
061. show = (TextView)this.findViewById(R.id.show);
062. myDate = (GridView)this.findViewById(R.id.myDate);
063. //取本地时间(时间应该从服务器获取)
064. nowTime.setToNow();
065. year = nowTime.year;
066. month = nowTime.month+1;
067. day = nowTime.monthDay;
068. show.setText(year+"-"+month+"-"+day);
069. }
070.  
071. /**
072. * @param   初始化数据库信息
073. */
074. private void initdata(){
075. sdao = new SignDAO(MainActivity.this);
076. sdao.open();
077. sinalist = sdao.findSinInfo("zhangsan","",year+""+month);//查询当月已签到的日期
078. list.clear();
079. dayMaxNum = getCurrentMonthDay();
080. for(int i=0;i<dayMaxNum;i++)
081. {
082. list.add(i, i+1+"");
083. }
084. myDate.setSelector(new ColorDrawable(Color.TRANSPARENT));
085. myDate.setAdapter(new getDayNumAdapter(getApplicationContext()));
086. }
087.  
088. class getDayNumAdapter extends BaseAdapter{
089.  
090. Context c;
091. public getDayNumAdapter(Context c)
092. {
093. this.c = c;
094. }
095.  
096. @Override
097. public int getCount() {
098. return list.size();
099. }
100.  
101. @Override
102. public Object getItem(int position) {
103. return list.get(position);
104. }
105.  
106. @Override
107. public long getItemId(int arg0) {
108. return 0;
109. }
110.  
111. @Override
112. public View getView(int position, View convertView, ViewGroup parent) {
113. View v = LinearLayout.inflate(c, R.layout.date, null);
114. TextView txtWeek = (TextView)v.findViewById(R.id.txtWeekDateMB);
115. TextView txtDay = (TextView)v.findViewById(R.id.txtDayDateMB);
116. switch (position)
117. {
118. case 0:
119. txtWeek.setText("一");
120. break;
121. case 1:
122. txtWeek.setText("二");
123. break;
124. case 2:
125. txtWeek.setText("三");
126. break;
127. case 3:
128. txtWeek.setText("四");
129. break;
130. case 4:
131. txtWeek.setText("五");
132. break;
133. case 5:
134. txtWeek.setText("六");
135. break;
136. case 6:
137. txtWeek.setText("日");
138. break;
139. }
140. if(position<7)
141. {
142. txtWeek.setVisibility(View.VISIBLE);
143. }
144. int lstDay = Integer.parseInt(list.get(position));
145. //标记当前日期
146. if(day==lstDay)
147. {
148. txtDay.setText(list.get(position).toString());
149. txtDay.setTextColor(Color.RED);
150. }else
151. txtDay.setText(list.get(position).toString());
152. //标记已签到后的背景
153. for(int i=0;i<sinalist.size();i++)
154. {
155. String nowdate = sinalist.get(i).get("sindate").toString();
156. String[] nowdatearr = nowdate.split("-");
157. if(lstDay==Integer.parseInt(nowdatearr[2])){
158. txtDay.setBackgroundColor(Color.BLUE);
159. ++ym;
160. }
161. sign.setText("已经签到天数:"+ym);
162. }
163. return v;
164. }
165.  
166. }
167.  
168.  
169. //获取当月的 天数
170. public  int getCurrentMonthDay() { 
171. Calendar a = Calendar.getInstance(); 
172. a.set(Calendar.DATE, 1); 
173. a.roll(Calendar.DATE, -1); 
174. int maxDate = a.get(Calendar.DATE); 
175. return maxDate; 
176. }
177.  
178.  
179.  
180.  
181. }
DBHelper.java
 
01. public class DBHelper extends SQLiteOpenHelper {
02.  
03. public DBHelper(Context context) {
04. super(context, "sign.db"null1);
05. }
06.  
07. /**
08. * @param   创建表
09. */
10. @Override
11. public void onCreate(SQLiteDatabase db) {
12. String sql="create table sinTB(" +
13. "sin_id integer primary key autoincrement," +
14. "userid varchar(20)," +
15. "usernmae varchar(20)," +
16. "sindate varchar(20)," +
17. "yearmonth varchar(20)," +
18. "nowdate integer" +
19. ")";
20. db.execSQL(sql);
21. }
22.  
23. /**
24. * @param   数据库版本更新时,会调用此方法
25. */
26. @Override
27. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
28.  
29. }
30.  
31. }
SignDAO.java
 
01. public class SignDAO {
02. //声明对象
03. Context context;
04. SQLiteDatabase db;
05. DBHelper dbHelper;
06.  
07. public SignDAO(Context context){
08. this.context = context;
09. }
10.  
11. /**
12. * @param 打开数据库连接
13. */
14. public boolean open(){
15. dbHelper = new DBHelper(context);
16. db = dbHelper.getWritableDatabase();
17. if(db == null){
18. return false;
19. }
20. return true;
21. }
22.  
23. /**
24. * @param   关闭连接
25. */
26. public void close(){
27. dbHelper.close();
28. }
29.  
30. /**
31. * @param   插入信息
32. * @param uid
33. * @param name
34. * @param date
35. * @param ym
36. */
37. public void insertSinInfo(String uid,String name,String date,String month){
38. String sql="insert into sinTB(userid,usernmae,sindate,yearmonth,nowdate) values(?,?,?,?,?)";
39. db.execSQL(sql,new Object[]{uid,name,date,month,System.currentTimeMillis()});
40. }
41.  
42. /**
43. * @param   查询信息
44. * @param uid
45. * @param date
46. * @param ym
47. * @return
48. */
49. public ArrayList<HashMap<String, Object>> findSinInfo(String uid,String date,String month){
50. ArrayList<HashMap<String,Object>> alist = new ArrayList<HashMap<String,Object>>();
51. alist.clear();
52. HashMap<String, Object> rowMap;
53. String sql;
54. try{
55. if("0".equals(month))
56. {
57. sql="select * from sinTB where userid='"+uid+"' and sindate='"+date+"'";
58. }
59. else
60. {
61. sql="select * from sinTB where userid='"+uid+"' and yearmonth='"+month+"'";
62. }
63. Cursor cur = db.rawQuery(sql, null);
64. cur.moveToFirst();
65. while(cur.moveToNext()){
66. rowMap = new HashMap<String, Object>();
67. rowMap.put("sin_id", cur.getInt(cur.getColumnIndex("sin_id")));
68. rowMap.put("userid", cur.getString(cur.getColumnIndex("userid")));
69. rowMap.put("usernmae", cur.getString(cur.getColumnIndex("usernmae")));
70. rowMap.put("sindate", cur.getString(cur.getColumnIndex("sindate")));
71. long aa = cur.getLong(cur.getColumnIndex("nowdate"));
72. SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
73. Date now = new Date(aa);
74. String date1 = format.format(now);
75. rowMap.put("nowdate", date1);
76. Log.e("", cur.getString(cur.getColumnIndex("sindate")));
77. alist.add(rowMap);
78. }
79. return alist;
80. }catch(Exception e){
81. return alist;
82. }
83.  
84. }
85. }
 
 

结伴旅游,一个免费的交友网站:www.jieberu.com

推推族,免费得门票,游景区:www.tuituizu.com


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM