我的Android案例—签到日历

原创 2016年08月29日 03:52:14

案例八:签到日历

知识点:

  1. GridView的使用
  2. SQLite的使用

涉及文件:

  1. res->layout->activity_main.xml主布局文件
  2. res->layout->date.xml布局文件
  3. src->db->DBHelper.javajava文件
  4. src->db->SignDAO.javajava文件
  5. src->activity->MainActivity.javajava文件
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;
		}
		
	}
}






看过本文的人也看了:
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Android 自定义日历-实现签到订约功能

前言aiyang:公司项目需要做一个签到送积分的系统,要求app实现这种签到功能。先在网上找了一些资料,有些用自定义View画图实现,其实对于普通码农对绘图会没耐心看各自算法。所以自己动手撸一个通用型...

Android中带签到功能的日历(积分)

利用gridview实现签到的日历
  • dailog
  • dailog
  • 2016年08月28日 10:05
  • 3530

android签到日历实现

先看最终实现的效果 事情是这样的,那一天我仍一如既往的在写代码(看新闻),隔了10米远我就看到一个傻。哦 不对 看见我们的经理走了过来。我的内心是这样的。 “怎么样,BUG改的怎么样了?”...

android 可签到的自定义日历控件

首先是MainActivity,源码如下public class MainActivity extends Activity { private SignCalendar calendar;...
  • Wheidan
  • Wheidan
  • 2016年11月23日 16:32
  • 1163

Android实现签到日历控件

  • 2017年10月23日 15:33
  • 44.13MB
  • 下载

new Date() 签到日历系统

var myData=new Date(); console.log(myData);  //返回日期     Tue Dec 20 2016 10:27:36 GMT+0800 (CST) cons...

Android 数据库自定义日历签到

  • 2017年06月13日 15:02
  • 573KB
  • 下载

Android日历签到

  • 2015年12月25日 17:35
  • 2.66MB
  • 下载

自定义日历 实现签到功能

先看下效果图 红色块为已签到的日期,样式可以随意更改,清晰明了,话不多说上代码: ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:我的Android案例—签到日历
举报原因:
原因补充:

(最多只允许输入30个字)