Android手机开发课程设计之记事本

打印 上一主题 下一主题

主题 504|帖子 504|积分 1512

一、需求分析
1.1业务需求分析
近年来,随着生活节奏的加快,工作和生活的双重压力全面侵袭着人们,如何避免忘记工作和生活中的诸多事情而造成不良的后果就显得非常重要。为此我们开发一款基于Android系统的简单记事本,其能够便携记录生活和工作对诸多事情,从而帮助人们有效地进行时间管理。
1.2功能需求分析
本记事本项目希望可以开发出一款符合用户生活工作习惯的简单应用,能够满足用户的各方面需求,可以对记事进行增加、查看、修改和删除,要求功能完善丰富并且具有良好的用户界面和交互体验。
二、项目设计
2.1功能模块设计
2.1.1记事本基本操作
记事本基本操作是该项目的核心部分,提供添加、查看、修改、删除记事本信息的功能,提供记事本动态更新的功能。
2.1.2 记事本主界面列表展示
用户可能需要创建许多记事事项,并且需要对这些记录事项进程基本操作,记事本的列表展示能使用户界面更加简洁清晰,且给用户带来使用方便。
2.1.3 记事本数据存储
记事本最重要功能即记录和保存用户易遗忘的日期和事件,为了持久地将用户记录事项信息保存下来,需要将这些信息存储到数据库中,记事本需要保存的信息字段有编号、事件内容和保存事件的具体时间。
其功能模块图如图所示。

2.2数据库设计
由上面的功能模块分析可知,本记事本项目的数据库设计主要包括三个字段名:编号id、事件内容content和保存事件的时间notetime,其数据库表如下表所示:

2.3界面设计
2.3.1记事本主界面
该界面主要包括添加按钮和记录事项列表。记事本主界面设计如下图所示。

2.3.2 添加记录事项界面
该界面主要包括清除内容和保存内容按钮以及文本编辑。记事本添加记录事项如下图所示。

三、项目实现
3.1 NotepadBean类
由于记事本中的每个记录都会有其唯一的编号id、记录内容notepadContent和保存记录的时间notepadTime属性,因此我们需要创建一个NotepadBean类用于存放这些属性,并实现其相应的getter和setter方法,其主要代码如下:
  1. public class NotepadBean {
  2.     private String id;//记录编号
  3.     private String notepadContent;//记录的内容
  4.     private String notepadTime;//保存记录的时间
  5.     public String getId() {
  6.         return id;
  7.     }
  8.     public void setId(String id) {
  9.         this.id = id;
  10.     }
  11.     public String getNotepadContent() {
  12.         return notepadContent;
  13.     }
  14.     public void setNotepadContent(String notepadContent) {
  15.         this.notepadContent = notepadContent;
  16.     }
  17.     public String getNotepadTime() {
  18.         return notepadTime;
  19.     }
  20.     public void setNotepadTime(String notepadTime) {
  21.         this.notepadTime = notepadTime;
  22.     }
复制代码
}
3.2 NotepadAdapter类
由于记事本界面的记录列表是使用ListView控件展示,因此需要创建一个数据适配器NotepadAdapter类对ListView控件进行数据适配,我们可以先创建NotepadAdapter类,再在NotepadAdapter类中创建一个ViewHolder类初始化Item界面中的控件,其中主要代码如下:
  1. public View getView(int position, View convertView, ViewGroup parent) {
  2.     ViewHolder viewHolder;
  3.     if (convertView==null){//加载Item界面对应的布局文件
  4.         convertView=layoutInflater.inflate(R.layout.notepad_item,null);
  5.         viewHolder=new ViewHolder(convertView);//创建ViewHolder对象
  6.         convertView.setTag(viewHolder);//创建ViewHolder对象
  7.     }else {
  8.         viewHolder=(ViewHolder) convertView.getTag();//convertView关联ViewHolder对象
  9.     }
  10.     NotepadBean notepadBean=(NotepadBean)getItem(position);//将获取的数据显示到对应的控件上
  11.     viewHolder.tvNotepadContent.setText(notepadBean.getNotepadContent());
  12.     viewHolder.tvNotepadTime.setText(notepadBean.getNotepadTime());
  13.     return convertView;
  14. }
  15. class ViewHolder{
  16.     TextView tvNotepadContent;
  17.     TextView tvNotepadTime;
  18.     public ViewHolder(View view){
  19.         tvNotepadContent=view.findViewById(R.id.item_content);//记录的内容
  20.         tvNotepadTime=view.findViewById(R.id.item_time);//保存记录的时间
  21.     }
  22. }
复制代码
3.3 SQLiteHelper类
在记事本程序中存储和读取记录的数据都是通过操作数据库完成的,我们需要创建SQLiteHelper类实现对数据库中表的增删改查,以及利用数据库中的工具类DBUtils来定义数据库的名称、表名、数据库版本、数据库表中的列名以及获取当前日期等信息,其主要代码如下:
创建数据库:
  1. public SQLiteHelper(Context context){
  2.     super(context, DBUtils.DATABASE_NAME,null,DBUtils.DATABASE_VERION);
  3.     sqLiteDatabase=this.getWritableDatabase();
  4. }
复制代码
创建表:
  1. @Override
  2. public void onCreate(SQLiteDatabase db){
  3.     db.execSQL("CREATE TABLE "+DBUtils.DATABASE_TABLE+"("+DBUtils.NOTEPAD_ID+" INTEGER PRIMARY KEY AUTOINCREMENT,"+DBUtils.NOTEPAD_CONTENT+" text, "+DBUtils.NOTEPAD_TIME+" text)");
  4. }
复制代码
添加数据:
  1. public boolean insertData(String userContent,String userTime){
  2.     ContentValues contentValues=new ContentValues();
  3.     contentValues.put(DBUtils.NOTEPAD_CONTENT,userContent);
  4.     contentValues.put(DBUtils.NOTEPAD_TIME,userTime);
  5.     return sqLiteDatabase.insert(DBUtils.DATABASE_TABLE,null,contentValues)>0;
  6. }
复制代码
删除数据:
  1. public boolean deleteData(String id){
  2.     String sql=DBUtils.NOTEPAD_ID+"=?";
  3.     String[] contentValuesArray=new String[]{String.valueOf(id)};
  4.     return sqLiteDatabase.delete(DBUtils.DATABASE_TABLE,sql,contentValuesArray)>0;
  5. }
复制代码
修改数据:
  1. public boolean updateData(String id,String content,String userYear){
  2.     ContentValues contentValues=new ContentValues();
  3.     contentValues.put(DBUtils.NOTEPAD_CONTENT,content);
  4.     contentValues.put(DBUtils.NOTEPAD_TIME,userYear);
  5.     String sql=DBUtils.NOTEPAD_ID+"=?";
  6.     String[] strings=new String[]{id};
  7.     return sqLiteDatabase.update(DBUtils.DATABASE_TABLE,contentValues,sql,strings)>0;
  8. }
复制代码
查询数据:
  1. public List<NotepadBean> query(){
  2.     List<NotepadBean>list=new ArrayList<NotepadBean>();
  3.     Cursor cursor=sqLiteDatabase.query(DBUtils.DATABASE_TABLE,null,null,
  4.             null,null,null,DBUtils.NOTEPAD_ID+" desc");
  5.     if (cursor!=null){
  6.         while (cursor.moveToNext()){
  7.             NotepadBean noteInfo=new NotepadBean();
  8.             String id=String.valueOf(cursor.getInt(cursor.getColumnIndex(DBUtils.NOTEPAD_ID)));
  9.             String content=cursor.getString(cursor.getColumnIndex(DBUtils.NOTEPAD_CONTENT));
  10.             String time=cursor.getString(cursor.getColumnIndex(DBUtils.NOTEPAD_TIME));
  11.             noteInfo.setId(id);
  12.             noteInfo.setNotepadContent(content);
  13.             noteInfo.setNotepadTime(time);
  14.             list.add(noteInfo);
  15.         }
  16.         cursor.close();
  17.     }
  18.     return list;
  19. }
复制代码
3.4 NotepadActivity类
记事本主界面包含显示列表和添加按钮功能,我们创建NotepadActivity类实现,其中显示列表在NotepadActivity类中通过创建showQueryData()方法,在该方法中查询数据库存放的记录信息,并将该信息显示到记录列表中,其实现代码如下:
  1. private void showQueryData(){
  2.     if(list!=null){
  3.         list.clear();
  4.     }
  5.     list=mSQLiteHelper.query();
  6.     adapter=new NotepadAdapter(this,list);
  7.     listView.setAdapter(adapter);
  8. }
  9. 为“添加按钮”通过setOnClickListener()方法设置点击事件,当点击该按钮时,跳转到添加记录的界面,其实现代码如下:
  10. protected void onCreate(Bundle savedInstanceState) {
  11.     super.onCreate(savedInstanceState);
  12.     setContentView(R.layout.activity_main);
  13.     listView=findViewById(R.id.listview);
  14.     ImageView imageView=findViewById(R.id.add);
  15.     initData();
  16.     imageView.setOnClickListener(new View.OnClickListener() {
  17.         @Override
  18.         public void onClick(View v) {
  19.             Intent intent=new Intent(NotepadActivity.this,RecordActivity.class);
  20.             startActivityForResult(intent,1);
  21.         }
  22.     });
  23. }
复制代码
3.5 RecordActivity类
RecordActivity为修改记录,我们在NotepadActivity中通过listView的setOnItemClickListener()方法监听Item的点击事件,携带被点击Item的记录内容跳转到RecordActivity中,其会根据获取的数据显示记录的内容。另外当我们需要删除记事本列表中的记录时,需要长按列表中的Item,此时会弹出一个对话框提示是否删除Item对应的事件。setOnItemClickListener()方法代码如下:
  1. listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){
  2.         @Override
  3.         public void onItemClick(AdapterView<?>parent,View view,int position,long id ){
  4.             NotepadBean notepadBean=list.get(position);
  5.             Intent intent=new Intent(NotepadActivity.this,RecordActivity.class);
  6.             intent.putExtra("id",notepadBean.getId());
  7.             intent.putExtra("content",notepadBean.getNotepadContent());
  8.             intent.putExtra("time",notepadBean.getNotepadTime());
  9.             NotepadActivity.this.startActivityForResult(intent,1);
  10.         }
  11.     });
  12.     listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
  13.         @Override
  14.         public boolean onItemLongClick(AdapterView<?> parent, View view, final int position, long id) {
  15.             AlertDialog dialog;
  16.             AlertDialog.Builder builder=new AlertDialog.Builder(NotepadActivity.this)
  17.                     .setMessage("是否删除此记录?")
  18.                     .setPositiveButton("确定", new DialogInterface.OnClickListener() {
  19.                         @Override
  20.                         public void onClick(DialogInterface dialog, int which) {
  21.                             NotepadBean notepadBean=list.get(position);
  22.                             if(mSQLiteHelper.deleteData(notepadBean.getId())){
  23.                                 list.remove(position);//删除对应的Item
  24.                                 adapter.notifyDataSetChanged();//更新记事本页面
  25.                                 Toast.makeText(NotepadActivity.this,"删除成功",Toast.LENGTH_LONG).show();
  26.                             }
  27.                         }
  28.                     })
  29.                     .setNegativeButton("取消", new DialogInterface.OnClickListener() {
  30.                         @Override
  31.                         public void onClick(DialogInterface dialog, int which) {
  32.                             dialog.dismiss();
  33.                         }
  34.                     });
  35.             dialog=builder.create();
  36.             dialog.show();
  37.             return true;
  38.         }
  39. });
复制代码
RecordActivity利用initData()函数接收传递的数据去,其代码如下:
  1. public void initData(){
  2.     mSQLiteHelper=new SQLiteHelper(this);
  3.     noteName.setText("添加记录");
  4.     Intent intent=getIntent();
  5.     if(intent!=null){
  6.         id=intent.getStringExtra("id");
  7.         if(id!=null){
  8.             noteName.setText("修改记录");
  9.             content.setText(intent.getStringExtra("content"));
  10.             note_time.setText(intent.getStringExtra("time"));
  11.             note_time.setVisibility(View.VISIBLE);
  12.         }
  13.     }
  14. }
复制代码
同时,我们在RecordActivity中可以利用switch…case结构实现了编辑记录、保存和清除编辑的记录的功能,即通过EditText控件实现记录的编辑功能,为保存按钮设置点击事件;当点击保存按钮时将记录的内容和保存时间通过SQLiteHelper类的insertData()方法添加到数据库中;为清除按钮设置点击事件,当点击清除按钮时,将EditText控件的内容通过setText()方法置为空字符串。其OnClick()函数代码如下:
  1. public void onClick(View v){
  2.     switch (v.getId()){
  3.         case R.id.note_back:
  4.             finish();
  5.             break;
  6.         case R.id.delete:
  7.             content.setText(" ");
  8.             break;
  9.         case R.id.note_save:
  10.             String noteContent =content.getText().toString().trim();
  11.             if(id!=null){
  12.                 //修改记录的功能
  13.                 if(noteContent.length()>0){
  14.                     if (mSQLiteHelper.updateData(id,noteContent,DBUtils.getTime())){
  15.                         showToast("修改成功");
  16.                         setResult(2);
  17.                         finish();
  18.                     }else{
  19.                         showToast("修改失败");
  20.                     }
  21.                 } else{
  22.                     showToast("修改的记录内容不能为空");
  23.                 }
  24.             }else{
  25.                 //添加记录的功能
  26.                 if(noteContent.length()>0){
  27.                     if (mSQLiteHelper.insertData(noteContent,DBUtils.getTime())){
  28.                         showToast("保存成功");
  29.                         setResult(2);
  30.                         finish();
  31.                     }else{
  32.                         showToast("保存失败");
  33.                     }
  34.                 } else{
  35.                     showToast("保存的记录内容不能为空");
  36.                 }
  37.             }
  38.             break;
  39.     }
  40. }
复制代码
四、项目测试
1、项目运行主界面。

2、点击主界面添加进入添加页面,输入“Android课程设计”然后点击保存按钮会返回主界面并弹出“保存成功”信息。

3、长按我们刚刚新建的记录“Android课程设计”会弹出删除对话框,点击确定即可删除,并弹出“删除成功”信息。

4、选择并打开“20182800”记录,将其修改为“20180000”,然后点击保存按钮,会弹出“修改成功”的信息。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

小小小幸运

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表