我的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

view sourceprint?

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

view sourceprint?

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

view sourceprint?

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

view sourceprint?

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

view sourceprint?

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

时间: 2024-08-27 22:43:05

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

我的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文件 ac

Android UI-自定义日历控件

Android UI-自定义日历控件 本篇博客笔者给大家分享一个日历控件,这里有个需求:要求显示当前月的日期,左右可以切换月份来查看日期. 我们想一想会如何去实现这样的一个控件,有开源的,但可能不太满足我们的特定的需求,这里笔者自定义了一个,读者可以根据自己的需求来修改代码.下面来说一下实现的思路: 首先我们要显示当前月份,自然我们要计算出当前的日期,并且把每一天对应到具体的星期,我们会有以下效果: 我们先想一下这样的效果用什么控件可以实现?很自然可以想到用网格视图GridView,但这里笔者使

Android自定义控件之日历控件

Android自定义控件之日历控件 2015-10-23 Android开发中文站 三月份学习android,至今也有半年有余,中间也做过两个项目,但是依然感觉自己做的应用不是很有新意,比不上应用市场上那些应用如此绚丽.所以自己仍需继续努力.学习至今,仍感觉自定义控件是一块硬骨头,还没修炼到身后的内功,下面就切入正题,以一次项目的需求,来实现一个自定义的日历控件.效果图先来一发. 我们分析下效果图,然后确定我们的需求. (1).绘制星期的自定义View,用于标识日期的礼拜. (2).绘制日期的自

Android 向系统日历中添加事件

查了一天半,总算有点大概了.以下是自己的理解,有错误的地方望指正. android系统有日历功能,应用程序可以根据一些接口开发自己的功能,即使是日历app也是根据这些接口开发的,所以我们可以利用程序向系统日历写入事件,然后用手机上的日历软件就可以看到我们添加的事件.网上这方面资料也不少,也有demo,但是我没找到一个可以正确运行的,有的是缺少参数,有的是版本的原因,4.0以上的系统这方面变动比较大,所以只能一边查资料一边修改. 大体思路就是:先查看系统日历是否有账户,如果没有必须要添加一个,然后

Android自定义实现日历

最近项目中要用到Android来实现日历功能,找了很多Demo都不是自己想要的后果,最后还是在githu上找到了一个开源项目来实现这一功能 先看一下Android自带的CalendarView和自定义实现的日历效果 CalendarView 自定义实现的日历效果 由于代码量有点大所以就不在这里贴出来了,可以直接下载Demo 代码使用了开源项目Caldroid,地址:https://github.com/roomorama/Caldroid

调用Android自带日历功能

Android手机配备有一个内置的日历应用程序.第三方应用程序可以利用日历内容提供商接口读取用户的日历信息和安排在日历新的事件.这个日历可以直接同步用户的谷歌日历. 不幸的是,没有文档和Android手机的日历应用集成,因为有另外一个联系人应用程序.相反,本文所提供的所有信息,将会通过逆向工程的谷歌日历内容提供商.该接口是受变化的,将会支持有限的功能.然而,日历一体化可以成为一些类型的应用强大的功能. 本文的代码测试之到Android 2.0 SDK版本.我们将发布一个更新如果有一个很大的转变.

我的Android案例—启动页

2015年的Android案例之旅 案例十:启动页 作用: 1. 打广告,放几张有点创意或者好看的图片吸引眼球 2. 数据准备,预加载一些数据,创建表什么的 知识点: ViewPager控件的的使用. 相应监听事件的调用 通过SharedPreferences来存储标识 涉及文件: res->layout->activity_main.xml 主界面布局文件 res->layout->splash.xml 欢迎界面布局文件 res->layout->guide 引导界面

获取与修改android自带日历日程

Android中的日历,只有真机才有,模拟上是没有的,所以测试环境一定要真机!! 因为日历是系统自带的,所以我们读写它一定要申请权限,也就是在AndroidManifest.xml加如下两行代码(一个读一个写): <!-- get calendar read and write permission --> <uses-permission android:name="android.permission.READ_CALENDAR" /> <uses-p

我的Android案例—电子词典

2015年的Android案例之旅 案例七:电子词典 知识点: 1.自动完成文本框(AutoCompleteTextView) AutoCompleteTextView是从EditText派生出来的,当用户输入一定字符之后,AutoCompleteTextView会显示一个下拉菜单,供用户选择,当用户选择某个菜单之后,内容会被填充到该文本中. 使用AutoCompleteTextView需要设置一个Adapter,该Adapter封装了预设的提示文本 2.SQLiteDataBase数据库 3.