標籤:android gridview
2015年的Android案例之旅案例八:簽到日曆知識點:
- GridView的使用
- SQLite的使用
涉及檔案:
- res->layout->activity_main.xml主布局檔案
- res->layout->date.xml布局檔案
- src->db->DBHelper.javajava檔案
- src->db->SignDAO.javajava檔案
- 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")@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Log.i(TAG, "SIGN is onCreate");//初始化對象init();//初始化資料庫資訊initdata();myDate.setOnItemClickListener(new OnItemClickListener(){@Overridepublic 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;}@Overridepublic int getCount() {return list.size();}@Overridepublic Object getItem(int position) {return list.get(position);}@Overridepublic long getItemId(int arg0) {return 0;}@Overridepublic 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);}elsetxtDay.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建立表 */@Overridepublic 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資料庫版本更新時,會調用此方法 */@Overridepublic 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案例—簽到日曆