Android Studio——记事本案例
一、布局界面
1、记事本界面布局
main_notepad.xml
2、记事本Item布局界面
activity_item.xml
3、添加、修改界面布局
activity_record.xml
二、封装记录信息实体类
记事本的每个记录都会有记录内容和记录时间这两个属性,因此需要建立一个实体类用于存放这些属性。
NotepadBean.java
public class NotepadBean { private String id; private String notepadContent; private String notepadTime; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getNotepadContent() { return notepadContent; } public void setNotepadContent(String notepadContent) { this.notepadContent = notepadContent; } public String getNotepadTime() { return notepadTime; } public void setNotepadTime(String notepadTime) { this.notepadTime = notepadTime; } }
三、编写记事本界面列表适配器
因为记事本的纪录列表是使用ListView控件展示的,因此需要建立一个数据适配器对ListView控件进行数据适配。
NotepadAdapter.java
public class NotepadAdapter extends BaseAdapter { private LayoutInflater layoutInflater; private List list; public NotepadAdapter(Context context, List list){ this.layoutInflater=LayoutInflater.from(context); this.list=list; } @Override //获取Item条目的总数 public int getCount(){ return list==null? 0: list.size(); } @Override //根据position(位置)获取某个Item的对象 public Object getItem(int position){ return list.get(position); } @Override //根据position(位置)获取某个Item的id public long getItemId(int position){ return position; } @Override //获取相应position对应的Item视图,position是当前Item的位置,convertView用于复用旧视图,parent用于加载xml布局 public View getView(int position, View convertView, ViewGroup parent){ ViewHolder viewHolder; //通过inflate()方法加载Item布局,并将获取的数据显示到对应的控件上,并判断旧视图是否为空,若为空,则创建一个ViewHolder对象 //通过set.Tag()方法将该对象添加到convertView中进行缓存,否则把获取的旧视图进行缓存 if(convertView==null){ convertView=layoutInflater.inflate(R.layout.activity_item,null); viewHolder=new ViewHolder(convertView); convertView.setTag(viewHolder); } else{ viewHolder=(ViewHolder) convertView.getTag(); } NotepadBean noteInfo=(NotepadBean) getItem(position); viewHolder.tvNoteoadContent.setText(noteInfo.getNotepadContent()); viewHolder.tvNotepadTime.setText(noteInfo.getNotepadTime()); return convertView; } class ViewHolder{ TextView tvNoteoadContent; TextView tvNotepadTime; public ViewHolder(View view){ tvNoteoadContent=(TextView) view.findViewById(R.id.ietm_content); tvNotepadTime=(TextView) view.findViewById((R.id.item_time)); } } }
四、创建数据库
因为记事本的存储和读取记录的数据都是通过数据库完成的,因此需要创建数据库
1、先创建一个DBUtils类,在该类中定义数据库的名称、表名、数据库版本、数据库表中的列名以及获取当前日期等信息。
DBUtils.java
public class DBUtils { public static final String DATABASE_NAME="Notepad"; public static final String DATABASE_TABLE="Note"; public static final int DATABASE_VERSION=1; //数据库表中的列名 public static final String NOTEPAD_ID="id"; public static final String NOTEPAD_CONTENT="content"; public static final String NOTEPAD_TIME="notetime"; //获取当前日期 public static final String getTime(){ SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy年MM月dd日HH:mm;ss"); Date date=new Date(System.currentTimeMillis()); return simpleDateFormat.format(date); } }
2、创建SQLiteHelper类,在该类中实现增删改查操作
SQLiteHelper.java
public class SQLiteHelper extends SQLiteOpenHelper { private SQLiteDatabase sqLiteDatabase; //创建数据库 public SQLiteHelper(Context context){ super(context, DBUtils.DATABASE_NAME,null,DBUtils.DATABASE_VERSION); sqLiteDatabase=this.getWritableDatabase(); } //创建表 @Override public void onCreate(SQLiteDatabase db){ db.execSQL("create table "+DBUtils.DATABASE_TABLE+"("+DBUtils.NOTEPAD_ID+" integer primary key autoincrement,"+DBUtils.NOTEPAD_CONTENT+" text,"+DBUtils.NOTEPAD_TIME+ " text)"); } @Override public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){} //添加数据 public boolean insertData(String userContent,String userTime){ ContentValues contentValues=new ContentValues(); contentValues.put(DBUtils.NOTEPAD_CONTENT,userContent); contentValues.put(DBUtils.NOTEPAD_TIME,userTime); return sqLiteDatabase.insert(DBUtils.DATABASE_TABLE,null,contentValues)>0; } //删除数据 public boolean deleteData(String id){ String sql=DBUtils.NOTEPAD_ID+"=?"; String [] contentValuesArray=new String[]{String.valueOf(id)}; return sqLiteDatabase.delete(DBUtils.DATABASE_TABLE,sql,contentValuesArray)>0; } //修改数据 public boolean updateData(String id,String content,String userYear){ ContentValues contentValues=new ContentValues(); contentValues.put(DBUtils.NOTEPAD_CONTENT,content); contentValues.put(DBUtils.NOTEPAD_TIME,userYear); String sql=DBUtils.NOTEPAD_ID+"=?"; String [] strings=new String[] {id}; return sqLiteDatabase.update(DBUtils.DATABASE_TABLE,contentValues,sql,strings)>0; } //查询数据 public List query(){ List list =new ArrayList(); Cursor cursor=sqLiteDatabase.query(DBUtils.DATABASE_TABLE,null,null,null,null,null,DBUtils.NOTEPAD_ID+" desc"); if(cursor!=null){ while(cursor.moveToNext()){ NotepadBean noteInfo=new NotepadBean(); @SuppressLint("range") String id=String.valueOf(cursor.getInt(cursor.getColumnIndex(DBUtils.NOTEPAD_ID))); @SuppressLint("range") String content=cursor.getString(cursor.getColumnIndex(DBUtils.NOTEPAD_CONTENT)); @SuppressLint("range") String time=cursor.getString(cursor.getColumnIndex(DBUtils.NOTEPAD_TIME)); noteInfo.setId(id); noteInfo.setNotepadContent(content); noteInfo.setNotepadTime(time); list.add(noteInfo); } cursor.close(); } return list; } }
五、实现添加记录界面功能
因为添加记录界面有保存和删除按钮,因此创建记录类实现点击事件,将编写的内容添加到数据库中。
RecordActivity.java
public class RecordActivity extends AppCompatActivity implements View.OnClickListener{ ImageView delete,note_save,note_back; TextView noteName,note_time; EditText content; SQLiteHelper mSQLiteHelper; String id; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_record); //通过findViewById获取界面控件 note_back=(ImageView) findViewById(R.id.note_back); note_save=(ImageView) findViewById(R.id.note_save); delete=(ImageView) findViewById(R.id.delete); noteName=(TextView) findViewById(R.id.note_name); note_time=(TextView) findViewById(R.id.tv_time); content=(EditText) findViewById(R.id.note_content); //设置启动器 note_back.setOnClickListener(this); delete.setOnClickListener(this); note_save.setOnClickListener(this); //初始化 initData(); } protected void initData(){ //创建数据库 mSQLiteHelper=new SQLiteHelper(this); noteName.setText("添加记录"); //接收记事本传来的消息 //getIntent()方法获取Intent对象 Intent intent=getIntent(); if(intent!=null){ //获取传递的记录id id=intent.getStringExtra("id"); if(id!=null){ noteName.setText("修改记录"); content.setText(intent.getStringExtra("content")); note_time.setText(intent.getStringExtra("time")); note_time.setVisibility(View.VISIBLE); } } } public void onClick(View v){ switch (v.getId()){ //后退,删除,保存事件 case R.id.note_back: finish(); break; case R.id.delete: content.setText(""); break; case R.id.note_save: //通过getText()获取输入内容 String noteContent=content.getText().toString().trim(); if(id!=null){ if(noteContent.length()>0){ if(mSQLiteHelper.updateData(id,noteContent,DBUtils.getTime())){ showToast("修改成功"); setResult(2); finish(); } else{ showToast("保存失败"); } } else{ showToast("保存内容不能为空"); } } //向数据库添加数据 else{ if(noteContent.length()>0){ if(mSQLiteHelper.insertData(noteContent,DBUtils.getTime())){ showToast("保存成功"); setResult(2); finish(); } else{ showToast("保存失败"); } } else{ showToast("修改内容不能为空"); } } break; } } public void showToast(String Message){ Toast.makeText(RecordActivity.this,Message,Toast.LENGTH_SHORT).show(); } }
六、实现记事本界面的显示功能
等于就是刚进入程序的界面的选择与操作
MainActivity.java
public class MainActivity extends Activity { ListView listView; List list; SQLiteHelper mSQLiteHelper; NotepadAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_notepad); //用于显示记录的列表 listView=(ListView) findViewById(R.id.listview); ImageView add=(ImageView) findViewById(R.id.add); //设置添加按钮事件 add.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //使用显示Intent指定要跳转的目标Activity,并通过startActivityForResult()方法开启目标Activity Intent intent=new Intent(MainActivity.this,RecordActivity.class); startActivityForResult(intent,1); } }); initData(); } protected void initData() { //创建数据库 mSQLiteHelper = new SQLiteHelper(this); showQueryData(); //处理查看记事本详细信息 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { //通过get方法获取对应的Item数据 NotepadBean notepadBean=list.get(position); //通过putExtra()方法封装到Intent对象中 Intent intent=new Intent(MainActivity.this,RecordActivity.class); intent.putExtra("id",notepadBean.getId()); intent.putExtra("time",notepadBean.getNotepadTime()); intent.putExtra("content",notepadBean.getNotepadContent()); MainActivity.this.startActivityForResult(intent,1); } }); //删除记事本记录 listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { AlertDialog dialog; AlertDialog.Builder builder=new AlertDialog.Builder(MainActivity.this) .setMessage("是否删除此纪录?") .setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //获取Item对象 NotepadBean notepadBean=list.get(position); if(mSQLiteHelper.deleteData(notepadBean.getId())){ //删除对应的Item list.remove(position); //更新记事本界面 adapter.notifyDataSetChanged(); Toast.makeText(MainActivity.this,"删除成功",Toast.LENGTH_SHORT).show(); } } }) .setPositiveButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); dialog=builder.create(); dialog.show(); return true; } }); } private void showQueryData(){ if(list!=null){ list.clear(); } //从数据库中查询数据 list=mSQLiteHelper.query(); adapter=new NotepadAdapter(this,list); listView.setAdapter(adapter); } @Override //重写,当关闭添加记录界面时,程序回调该方法 // 并在该方法中调用showQueryData()方法重新获取数据库中保存的记录数据并显示到记录列表中 protected void onActivityResult(int requestCode,int resultCode,Intent data){ super.onActivityResult(requestCode,resultCode,data); if(requestCode==1&&resultCode==2){ showQueryData(); } } }
七、运行结果截图
主界面
选择添加按钮之后进入编写界面
修改界面
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理!
部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!
图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!