android-新手写《课程表》

----前言

刚上大学,由于不是在固定的地点上课,所以我需要一个课程表APP来记录我每天的课程和对应的地点。

根据我所在学校上课安排,我上午最多只有两门课(每门两节),下午只有一门课,晚上也只有一门课。

-----功能描述

android-新手写《课程表》_第1张图片
1、打开程序会显示当前星期几的课程表。
2、点击按钮可以查看前一天或后一天的课程表。
3、长按列表的某一项,会弹出对话框,可以修改该项内容。
4、连续按两次返回键,退出该程序。

----正文

要点:

根据前面所提,我把一天分成4个部分(上午一二节、上午三四节、下午、晚上),包含的内容有:课程、地点、时间。

布局如下:

android-新手写《课程表》_第2张图片

一、我在电脑上用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;  
        }  
  
    }; 

《课程表》源码下载-------------------------------点击打开链接








你可能感兴趣的:(android)