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

我的Android案例签到日历的更多相关文章

  1. Android 向系统日历中添加事件

    查了一天半,总算有点大概了.以下是自己的理解,有错误的地方望指正. android系统有日历功能,应用程序可以根据一些接口开发自己的功能,即使是日历app也是根据这些接口开发的,所以我们可以利用程序向 ...

  2. Android开发之日历控件实现

    Android开发之日历控件实现:以下都是转载的. 日历控件 日历控件 日历控件 日历控件

  3. 调用Android自带日历功能(日历列表单、添加一个日历事件)

    调用Android自带日历功能  觉得这篇文章不错,转载过来. 转载:http://blog.csdn.net/djy1992/article/details/9948393 Android手机配备有 ...

  4. Android自定义控件之日历控件

      标签: android 控件 日历 应用 需求 2015年09月26日 22:21:54 25062人阅读 评论(109) 收藏 举报 分类: Android自定义控件系列(7) 版权声明:转载注 ...

  5. Android向系统日历中添加日程事件

    转自Android向系统日历中添加日程事件 总结 在项目开发中,我们有预约提醒.定时提醒需求时,可以使用系统日历来辅助提醒: 通过向系统日历中写入事件.设置提醒方式(闹钟),实现到时间自动提醒的功能: ...

  6. 调用Android自带日历功能

    Android手机配备有一个内置的日历应用程序.第三方应用程序可以利用日历内容提供商接口读取用户的日历信息和安排在日历新的事件.这个日历可以直接同步用户的谷歌日历. 不幸的是,没有文档和Android ...

  7. android 案例:从另一个activity选择信息并获取返回值

    主窗口: package com.example.test; import android.app.Activity; import android.app.AlertDialog; import a ...

  8. Android向系统日历添加日程提醒事件

    在项目开发过程中,有时会有预约提醒.定时提醒等需求,这时我们可以使用系统日历来辅助提醒.通过向系统日历中写入事件.设置提醒方式(闹钟),实现到达某个特定的时间自动提醒的功能.这样做的好处是由于提醒功能 ...

  9. Android -- 案例学习积累

    Theme ActionBar / ToolBar android.support.design.widget.CollapsingToolbarLayout android.support.desi ...

随机推荐

  1. hue数据导出

    1/ 执行要下载的sql语句 2/  执行完成后,点击下面导出 3.选择所有 4.选择每个人对应的文件夹,没有自己名称的可以创建一个 5.选择导出 6.右面是导出执行时的界面 7.选择已经执行的文件 ...

  2. spring boot-4.配置文件

    官方文档的23.4章节介绍了关于配置文件的内容 springboot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的 ...

  3. 云服务器以及linux操作系统打开防火墙,在墙上开一个小口

    在服务器运行时,需要在某个端口上开一个小口,以供外部访问 执行命令/sbin/iptables -I INPUT -p tcp --dport 8080 -j ACCEPT 8080为端口号,需要开的 ...

  4. Git_命令初解

  5. CSS 相对定位 绝对定位

    css中的相对定位和绝对定位. 定位标签:position 包含属性:relative(相对) absolute(绝对) 1.position:relative; 如果对一个元素进行相对定位,首先它将 ...

  6. Linux服务器应急事件溯源报告

    Linux服务器应急事件溯源报告 小博博 · 2016/02/18 17:43 Author:Inn0team 0x00 目录 关于目标环境的中间进度检测报告 一:情况概述 二:取证情况 2.1 目标 ...

  7. sql认识

    DDL – Data Definition Language数据定义语言DML – Data Manipulation Language数据操作语言DCL – Data Control Languag ...

  8. uoj #450[集训队作业2018]复读机

    传送门 \(d=1\),那么任何时刻都可以\(k\)个复读机的一种,答案为\(k^n\) \(d>1\),可以枚举某个复读机的复读次数(必须是\(d\)的倍数),然后第\(i\)个复读时间为\( ...

  9. centos7配置mysql8.0主从复制

    注意:1.主库:10.1.131.75,从库:10.1.131.762.server-id必须是纯数字,并且主从两个server-id在局域网内要唯一. [主节点]vi /etc/my.cnf[mys ...

  10. MySQL 7种 JOIN连表方法

    规定:左边的圆代表表 a,右边的代表 b. JOIN 关键字可以在两表之间选中任意部分.] 通过以下代码制造一些数据: delimiter // drop procedure if exists pr ...