小弟我的Android案例—签到日历
我的Android案例—签到日历
activity_main.xml
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
<!-- 线性布局 -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:orientation="vertical">
<!-- 文本控件
显示当前月份 -->
<TextView
android:id="@+id/show"
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="月份"/>
<!-- 网格视图
-->
<GridView
android:id="@+id/myDate"
android:layout_width="match_parent"
android:layout_height="355dp"
android:numColumns="7"></GridView>
<Button
android:id="@+id/sign"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="签到"/>
</LinearLayout>
date.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/txtWeekDateMB"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginTop="10dp"
android:visibility="gone" />
<TextView
android:id="@+id/txtDayDateMB"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginTop="10dp" />
</LinearLayout>
MainActivity.java
public class MainActivity extends Activity {
//Log标签
private static final String TAG = "SIGN";
//声明对象
private Button sign;
private TextView show;
private GridView myDate;
//获取本地时间
Time nowTime = new Time();
//一个月内的天数
private int dayMaxNum;
private int year,month,day,ym;
private SignDAO sdao;
//查询结果
private List<String> list = new ArrayList<String>();
private ArrayList<HashMap<String, Object>> sinalist,alisttmp;
@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i(TAG, "SIGN is onCreate");
//初始化对象
init();
//初始化数据库信息
initdata();
myDate.setOnItemClickListener(new OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
//判断是否已经签到 从服务器获取签到信息
//模拟从本地数据库获取信息
if(day==arg2+1)//只能当天签到
{
sinalist = sdao.findSinInfo("zhangsan",year+"-"+month+"-"+(arg2+1),"0");
if(sinalist.size()>0)
{
Toast.makeText(getApplicationContext(), "已经签过到不能重复签到", 200).show();
Log.d("", "已签到");
}
else
{
//在数据库插入一条数据
sdao.insertSinInfo("zhangsan", "张三", year+"-"+month+"-"+(arg2+1),year+""+month);
initdata();
}
}
}
});
}
/**
* @param 初始化对象
*/
private void init(){
sign = (Button)this.findViewById(R.id.sign);
show = (TextView)this.findViewById(R.id.show);
myDate = (GridView)this.findViewById(R.id.myDate);
//取本地时间(时间应该从服务器获取)
nowTime.setToNow();
year = nowTime.year;
month = nowTime.month+1;
day = nowTime.monthDay;
show.setText(year+"-"+month+"-"+day);
}
/**
* @param 初始化数据库信息
*/
private void initdata(){
sdao = new SignDAO(MainActivity.this);
sdao.open();
sinalist = sdao.findSinInfo("zhangsan","",year+""+month);//查询当月已签到的日期
list.clear();
dayMaxNum = getCurrentMonthDay();
for(int i=0;i<dayMaxNum;i++)
{
list.add(i, i+1+"");
}
myDate.setSelector(new ColorDrawable(Color.TRANSPARENT));
myDate.setAdapter(new getDayNumAdapter(getApplicationContext()));
}
class getDayNumAdapter extends BaseAdapter{
Context c;
public getDayNumAdapter(Context c)
{
this.c = c;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int arg0) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = LinearLayout.inflate(c, R.layout.date, null);
TextView txtWeek = (TextView)v.findViewById(R.id.txtWeekDateMB);
TextView txtDay = (TextView)v.findViewById(R.id.txtDayDateMB);
switch (position)
{
case 0:
txtWeek.setText("一");
break;
case 1:
txtWeek.setText("二");
break;
case 2:
txtWeek.setText("三");
break;
case 3:
txtWeek.setText("四");
break;
case 4:
txtWeek.setText("五");
break;
case 5:
txtWeek.setText("六");
break;
case 6:
txtWeek.setText("日");
break;
}
if(position<7)
{
txtWeek.setVisibility(View.VISIBLE);
}
int lstDay = Integer.parseInt(list.get(position));
//标记当前日期
if(day==lstDay)
{
txtDay.setText(list.get(position).toString());
txtDay.setTextColor(Color.RED);
}else
txtDay.setText(list.get(position).toString());
//标记已签到后的背景
for(int i=0;i<sinalist.size();i++)
{
String nowdate = sinalist.get(i).get("sindate").toString();
String[] nowdatearr = nowdate.split("-");
if(lstDay==Integer.parseInt(nowdatearr[2])){
txtDay.setBackgroundColor(Color.BLUE);
++ym;
}
sign.setText("已经签到天数:"+ym);
}
return v;
}
}
//获取当月的 天数
public int getCurrentMonthDay() {
Calendar a = Calendar.getInstance();
a.set(Calendar.DATE, 1);
a.roll(Calendar.DATE, -1);
int maxDate = a.get(Calendar.DATE);
return maxDate;
}
}
DBHelper.java
public class DBHelper extends SQLiteOpenHelper {
public DBHelper(Context context) {
super(context, "sign.db", null, 1);
}
/**
* @param 创建表
*/
@Override
public void onCreate(SQLiteDatabase db) {
String sql="create table sinTB(" +
"sin_id integer primary key autoincrement," +
"userid varchar(20)," +
"usernmae varchar(20)," +
"sindate varchar(20)," +
"yearmonth varchar(20)," +
"nowdate integer" +
")";
db.execSQL(sql);
}
/**
* @param 数据库版本更新时,会调用此方法
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
SignDAO.java
public class SignDAO {
//声明对象
Context context;
SQLiteDatabase db;
DBHelper dbHelper;
public SignDAO(Context context){
this.context = context;
}
/**
* @param 打开数据库连接
*/
public boolean open(){
dbHelper = new DBHelper(context);
db = dbHelper.getWritableDatabase();
if(db == null){
return false;
}
return true;
}
/**
* @param 关闭连接
*/
public void close(){
dbHelper.close();
}
/**
* @param 插入信息
* @param uid
* @param name
* @param date
* @param ym
*/
public void insertSinInfo(String uid,String name,String date,String month){
String sql="insert into sinTB(userid,usernmae,sindate,yearmonth,nowdate) values(?,?,?,?,?)";
db.execSQL(sql,new Object[]{uid,name,date,month,System.currentTimeMillis()});
}
/**
* @param 查询信息
* @param uid
* @param date
* @param ym
* @return
*/
public ArrayList<HashMap<String, Object>> findSinInfo(String uid,String date,String month){
ArrayList<HashMap<String,Object>> alist = new ArrayList<HashMap<String,Object>>();
alist.clear();
HashMap<String, Object> rowMap;
String sql;
try{
if("0".equals(month))
{
sql="select * from sinTB where userid='"+uid+"' and sindate='"+date+"'";
}
else
{
sql="select * from sinTB where userid='"+uid+"' and yearmonth='"+month+"'";
}
Cursor cur = db.rawQuery(sql, null);
cur.moveToFirst();
while(cur.moveToNext()){
rowMap = new HashMap<String, Object>();
rowMap.put("sin_id", cur.getInt(cur.getColumnIndex("sin_id")));
rowMap.put("userid", cur.getString(cur.getColumnIndex("userid")));
rowMap.put("usernmae", cur.getString(cur.getColumnIndex("usernmae")));
rowMap.put("sindate", cur.getString(cur.getColumnIndex("sindate")));
long aa = cur.getLong(cur.getColumnIndex("nowdate"));
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date now = new Date(aa);
String date1 = format.format(now);
rowMap.put("nowdate", date1);
Log.e("", cur.getString(cur.getColumnIndex("sindate")));
alist.add(rowMap);
}
return alist;
}catch(Exception e){
return alist;
}
}
}
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/txtWeekDateMB" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_marginTop="10dp" android:visibility="gone" /> <TextView android:id="@+id/txtDayDateMB" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_marginTop="10dp" /> </LinearLayout>
MainActivity.java
public class MainActivity extends Activity { //Log标签 private static final String TAG = "SIGN"; //声明对象 private Button sign; private TextView show; private GridView myDate; //获取本地时间 Time nowTime = new Time(); //一个月内的天数 private int dayMaxNum; private int year,month,day,ym; private SignDAO sdao; //查询结果 private List<String> list = new ArrayList<String>(); private ArrayList<HashMap<String, Object>> sinalist,alisttmp; @SuppressLint("NewApi") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.i(TAG, "SIGN is onCreate"); //初始化对象 init(); //初始化数据库信息 initdata(); myDate.setOnItemClickListener(new OnItemClickListener(){ @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { //判断是否已经签到 从服务器获取签到信息 //模拟从本地数据库获取信息 if(day==arg2+1)//只能当天签到 { sinalist = sdao.findSinInfo("zhangsan",year+"-"+month+"-"+(arg2+1),"0"); if(sinalist.size()>0) { Toast.makeText(getApplicationContext(), "已经签过到不能重复签到", 200).show(); Log.d("", "已签到"); } else { //在数据库插入一条数据 sdao.insertSinInfo("zhangsan", "张三", year+"-"+month+"-"+(arg2+1),year+""+month); initdata(); } } } }); } /** * @param 初始化对象 */ private void init(){ sign = (Button)this.findViewById(R.id.sign); show = (TextView)this.findViewById(R.id.show); myDate = (GridView)this.findViewById(R.id.myDate); //取本地时间(时间应该从服务器获取) nowTime.setToNow(); year = nowTime.year; month = nowTime.month+1; day = nowTime.monthDay; show.setText(year+"-"+month+"-"+day); } /** * @param 初始化数据库信息 */ private void initdata(){ sdao = new SignDAO(MainActivity.this); sdao.open(); sinalist = sdao.findSinInfo("zhangsan","",year+""+month);//查询当月已签到的日期 list.clear(); dayMaxNum = getCurrentMonthDay(); for(int i=0;i<dayMaxNum;i++) { list.add(i, i+1+""); } myDate.setSelector(new ColorDrawable(Color.TRANSPARENT)); myDate.setAdapter(new getDayNumAdapter(getApplicationContext())); } class getDayNumAdapter extends BaseAdapter{ Context c; public getDayNumAdapter(Context c) { this.c = c; } @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return list.get(position); } @Override public long getItemId(int arg0) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { View v = LinearLayout.inflate(c, R.layout.date, null); TextView txtWeek = (TextView)v.findViewById(R.id.txtWeekDateMB); TextView txtDay = (TextView)v.findViewById(R.id.txtDayDateMB); switch (position) { case 0: txtWeek.setText("一"); break; case 1: txtWeek.setText("二"); break; case 2: txtWeek.setText("三"); break; case 3: txtWeek.setText("四"); break; case 4: txtWeek.setText("五"); break; case 5: txtWeek.setText("六"); break; case 6: txtWeek.setText("日"); break; } if(position<7) { txtWeek.setVisibility(View.VISIBLE); } int lstDay = Integer.parseInt(list.get(position)); //标记当前日期 if(day==lstDay) { txtDay.setText(list.get(position).toString()); txtDay.setTextColor(Color.RED); }else txtDay.setText(list.get(position).toString()); //标记已签到后的背景 for(int i=0;i<sinalist.size();i++) { String nowdate = sinalist.get(i).get("sindate").toString(); String[] nowdatearr = nowdate.split("-"); if(lstDay==Integer.parseInt(nowdatearr[2])){ txtDay.setBackgroundColor(Color.BLUE); ++ym; } sign.setText("已经签到天数:"+ym); } return v; } } //获取当月的 天数 public int getCurrentMonthDay() { Calendar a = Calendar.getInstance(); a.set(Calendar.DATE, 1); a.roll(Calendar.DATE, -1); int maxDate = a.get(Calendar.DATE); return maxDate; } }
DBHelper.java
public class DBHelper extends SQLiteOpenHelper {
public DBHelper(Context context) {
super(context, "sign.db", null, 1);
}
/**
* @param 创建表
*/
@Override
public void onCreate(SQLiteDatabase db) {
String sql="create table sinTB(" +
"sin_id integer primary key autoincrement," +
"userid varchar(20)," +
"usernmae varchar(20)," +
"sindate varchar(20)," +
"yearmonth varchar(20)," +
"nowdate integer" +
")";
db.execSQL(sql);
}
/**
* @param 数据库版本更新时,会调用此方法
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
SignDAO.java
public class SignDAO {
//声明对象
Context context;
SQLiteDatabase db;
DBHelper dbHelper;
public SignDAO(Context context){
this.context = context;
}
/**
* @param 打开数据库连接
*/
public boolean open(){
dbHelper = new DBHelper(context);
db = dbHelper.getWritableDatabase();
if(db == null){
return false;
}
return true;
}
/**
* @param 关闭连接
*/
public void close(){
dbHelper.close();
}
/**
* @param 插入信息
* @param uid
* @param name
* @param date
* @param ym
*/
public void insertSinInfo(String uid,String name,String date,String month){
String sql="insert into sinTB(userid,usernmae,sindate,yearmonth,nowdate) values(?,?,?,?,?)";
db.execSQL(sql,new Object[]{uid,name,date,month,System.currentTimeMillis()});
}
/**
* @param 查询信息
* @param uid
* @param date
* @param ym
* @return
*/
public ArrayList<HashMap<String, Object>> findSinInfo(String uid,String date,String month){
ArrayList<HashMap<String,Object>> alist = new ArrayList<HashMap<String,Object>>();
alist.clear();
HashMap<String, Object> rowMap;
String sql;
try{
if("0".equals(month))
{
sql="select * from sinTB where userid='"+uid+"' and sindate='"+date+"'";
}
else
{
sql="select * from sinTB where userid='"+uid+"' and yearmonth='"+month+"'";
}
Cursor cur = db.rawQuery(sql, null);
cur.moveToFirst();
while(cur.moveToNext()){
rowMap = new HashMap<String, Object>();
rowMap.put("sin_id", cur.getInt(cur.getColumnIndex("sin_id")));
rowMap.put("userid", cur.getString(cur.getColumnIndex("userid")));
rowMap.put("usernmae", cur.getString(cur.getColumnIndex("usernmae")));
rowMap.put("sindate", cur.getString(cur.getColumnIndex("sindate")));
long aa = cur.getLong(cur.getColumnIndex("nowdate"));
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date now = new Date(aa);
String date1 = format.format(now);
rowMap.put("nowdate", date1);
Log.e("", cur.getString(cur.getColumnIndex("sindate")));
alist.add(rowMap);
}
return alist;
}catch(Exception e){
return alist;
}
}
}
public class SignDAO { //声明对象 Context context; SQLiteDatabase db; DBHelper dbHelper; public SignDAO(Context context){ this.context = context; } /** * @param 打开数据库连接 */ public boolean open(){ dbHelper = new DBHelper(context); db = dbHelper.getWritableDatabase(); if(db == null){ return false; } return true; } /** * @param 关闭连接 */ public void close(){ dbHelper.close(); } /** * @param 插入信息 * @param uid * @param name * @param date * @param ym */ public void insertSinInfo(String uid,String name,String date,String month){ String sql="insert into sinTB(userid,usernmae,sindate,yearmonth,nowdate) values(?,?,?,?,?)"; db.execSQL(sql,new Object[]{uid,name,date,month,System.currentTimeMillis()}); } /** * @param 查询信息 * @param uid * @param date * @param ym * @return */ public ArrayList<HashMap<String, Object>> findSinInfo(String uid,String date,String month){ ArrayList<HashMap<String,Object>> alist = new ArrayList<HashMap<String,Object>>(); alist.clear(); HashMap<String, Object> rowMap; String sql; try{ if("0".equals(month)) { sql="select * from sinTB where userid='"+uid+"' and sindate='"+date+"'"; } else { sql="select * from sinTB where userid='"+uid+"' and yearmonth='"+month+"'"; } Cursor cur = db.rawQuery(sql, null); cur.moveToFirst(); while(cur.moveToNext()){ rowMap = new HashMap<String, Object>(); rowMap.put("sin_id", cur.getInt(cur.getColumnIndex("sin_id"))); rowMap.put("userid", cur.getString(cur.getColumnIndex("userid"))); rowMap.put("usernmae", cur.getString(cur.getColumnIndex("usernmae"))); rowMap.put("sindate", cur.getString(cur.getColumnIndex("sindate"))); long aa = cur.getLong(cur.getColumnIndex("nowdate")); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date now = new Date(aa); String date1 = format.format(now); rowMap.put("nowdate", date1); Log.e("", cur.getString(cur.getColumnIndex("sindate"))); alist.add(rowMap); } return alist; }catch(Exception e){ return alist; } } }