刚上大学,由于不是在固定的地点上课,所以我需要一个课程表APP来记录我每天的课程和对应的地点。
根据我所在学校上课安排,我上午最多只有两门课(每门两节),下午只有一门课,晚上也只有一门课。
根据前面所提,我把一天分成4个部分(上午一二节、上午三四节、下午、晚上),包含的内容有:课程、地点、时间。
布局如下:
一、我在电脑上用SQLiteExpert建了一个命名为schedule.db的数据库,数据库包含了Sunday...到Saturday的七张表,每张表的字段为course、place、time,并录入了内容。
把schedule.db复制到res/raw文件夹下,安装程序的时候再把schedule.db复制到sdcard中,然后再对数据库进行操作。
(注意要修改读写权限)在AndroidManifest.xml文件修改,在manifest标签下添加<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>,该段与application同级
复制schedule.db到sdcard中代码如下:
<span style="white-space:pre"></span><pre name="code" class="java"><span style="white-space:pre"> </span>public void copyDb(String Path, String dbName) //把数据库文件复制到sdcard中 { File file = new File(Path, dbName); if (!file.exists()) { file.getParentFile().mkdirs(); InputStream iStream = MainActivity.this.getResources().openRawResource( R.raw.schedule); try { FileOutputStream fos = new FileOutputStream(file); byte[] buffer = new byte[1024]; int count = 0; // 将静态数据库文件拷贝到目的地 while ((count = iStream.read(buffer)) > 0) { fos.write(buffer, 0, count); } fos.close(); iStream.close(); Toast.makeText(MainActivity.this, "本地数据库加载成功", Toast.LENGTH_SHORT).show(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { Toast.makeText(MainActivity.this, "本地数据库加载失败", Toast.LENGTH_SHORT).show(); e.printStackTrace(); } } }
再创建一个类对数据库进行操作:
public class Dao { Context context; SQLiteDatabase db = null; Table table = new Table(); public Dao(Context context) { final String PATH = "/mnt/sdcard/schedule.db"; this.context = context; this.db = SQLiteDatabase.openDatabase(PATH, null, SQLiteDatabase.OPEN_READWRITE); } public Table read(int flag) // 读取flag所代表的某张表的数据,以Table对象保存 { return table; } public void write(int flag, String course, String place, int item_position) { } }
二、这里只有一个activity和一个ListView,要想点击按钮刷新ListView内容,那么要在修改数据之后添加Adapter.notifyDataSetChanged();即可实现ListView数据更新。
三、添加列表项长按事件监听器、弹出对话框
<span style="white-space:pre"> </span>listView.setOnItemLongClickListener(new OnItemLongClickListener() //listView里的item长按事件 { public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { TableLayout dialog = (TableLayout) getLayoutInflater() .inflate(R.layout.dialog, null); final EditText et_course = (EditText) dialog.findViewById(R.id.editText1); final EditText et_place = (EditText) dialog.findViewById(R.id.editText2); final int p = position; new AlertDialog.Builder(MainActivity.this) // .setTitle("dd") 设置dialog标题 .setView(dialog) .setPositiveButton("确定", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { //更新表数据 dao.write(flag, et_course.getText().toString(), et_place.getText().toString(), p); //刷新listview显示内容 setAdapter(); simpleAdapter.notifyDataSetChanged(); } }) .setNegativeButton("取消", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { // TODO 自动生成的方法存根 } }) .create() .show(); return false; } });四、点击两次返回键,退出程序。
<span style="white-space:pre"> </span>boolean isExit; <span style="white-space:pre"> </span>private void exit() { if (!isExit) { isExit = true; Toast.makeText(getApplicationContext(), "再按一次退出程序", Toast.LENGTH_SHORT).show(); mHandler.sendEmptyMessageDelayed(0, 2000); } else { Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_HOME); startActivity(intent); System.exit(0); } } Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); isExit = false; } };