一、搭建记事本布局
效果图:


(activity_notepad.xml)
1.去掉标题栏:在AndroidManifest.xml中的theme改成NoActionBar。
2.记事本主页布局:
<!--1.搭建记事本界面布局-->
<!--(1)TextView:显示界面标题-->
<!--(2)ListView:显示记录列表-->
<!--(3)ImageView:图片作添加按钮-->
3.细节解释:
(1)相对布局中:
背景色:#fefefe(网页安全色:偏白黄色)
android:background="#fefefe"
(2)ListView:
android:cacheColorHint="#00000000" <--避免滚动时,重绘View时出现其他颜色-->
android:divider="#E4E4E4" <--分割线:"#E4E4E4"颜色为极亮度的灰色阴影-->
android:dividerHeight="1dp" <--设置分割线高度-->
android:fadingEdge="none" <--滚动效果:取消滚动时的阴影层次-->
android:listSelector="#00000000" <--避免默认会显示选中的item为橙黄底色-->
android:scrollbars="none" <--滚动条:隐藏-->
android:layout_below="@+id/note_name" <--在~位置之下:在@+id/note_name控件之下-->
3.ImageView
android:layout_marginBottom="30dp" <--距离底部:30dp-->
android:layout_alignParentBottom="true" <--悬浮,并一直处于屏幕底端-->
android:layout_centerHorizontal="true" <--位置:居中-->
二、搭建记事本主界面的Item布局
(notepad_item_layout.xml)
1.Item布局
<!--2.搭建记事本主界面里的Item布局-->
<!--(1)TextView:显示内容-->
<!--(2)TextView:显示时间-->
2.细节解释:
android:maxLines="2" <--最大显示行数:2行(无论有多少行,只显示2行)-->
android:ellipsize="end" <--压缩显示:若内容过多,省略号在结尾-->
android:lineSpacingExtra="3dp" <--行间距-->
android:paddingTop="10dp" <--该控件内部度内容距离该控件上边缘的边距-->
三、封装记录信息实体类
(NotepadBean.java)
1.getset方法:
Id(记录的id)、notepadCountent(记录的内容)、noteoadTime(保存记录的时间)
四、编写记事本界面列表适配器
(NotepadAdapter.java)
1.继承BaseAdapter
(1)XML布局对象:LayoutInflater layoutInflater
(2)实体信息对象:List list
2.构造方法
3.四个重写
(1)获取Item总数:getCount()
(2)对应Item对象:getItem(int position)
(3)Item对象的Id:getItemId(int position)
(4)对应的Item视图:getView(int position, View convertView, ViewGroup parent)
在getView中:声明一个ViewHolder viewHolder类对象
- 在getView外:实现ViewHolder类:声明实际item布局空间
- 在实现ViewHolder类中:实现findViewById()方法
- 在getView外:实现ViewHolder类:声明实际item布局空间
套路:关联viewholder与convertView
if (convertView == null) { convertView = layoutInflater.inflate(R.layout.notepad_item_layout, null);//实例化一个对象(布局加载器) viewHolder = new ViewHolder(convertView);//实例化类对象 convertView.setTag(viewHolder);//关联viewholder与convertView } else { viewHolder = (ViewHolder) convertView.getTag(); }获取实体信息类
获取相应的值set(get)
4.把Item的布局放为一个类(对应(4)的getView外)
5.实现数据跟控件的一一对应(在View中找到控件)findViewById(对应(4)的在实现ViewHolder类外)
五、创建数据库
(DBUtils.java、SQLiteHelper,java)
1.创建DBUtils类
(1)定义数据库的名称、表名、数据库版本、数据库表中的列名以及获取当前日期等消息
2.创建SQLiteHelper类
(1)创建数据库
(2)重写创建表、修改方法
(3)增删改查方法
六、实现记事本界面的显示功能
(NotepadActivity.java)
1.继承Activity
2.声明控件、数据库、实体信息、适配器
3.重写监听点击按钮:跳转
重写onCreate()方法
- 加载xml布局文件
setContentView(R.layout.activity_notepad);- 与xml控件联系
listView = (ListView) findViewById(R.id.listview); add = (ImageView) findViewById(R.id.add);
4.点击添加的触发器:匿名内部类实现事件监听(页面跳转)
5.初始化数据:数据库
6.点击列表的触发器:匿名内部类实现事件监听(实现查看记录的功能)
7.关闭添加、修改页面返回主页面时的显示:
七、搭建添加记录界面和修改记录界面的布局
(activity_record.xml)
八、实现添加、修改记录界面的功能
(RecordActivity.java)
1.标题的添加与修改,通过判断是否有id,实现标题是“添加”、“修改”。
2.实现“保存”、“清空”、“返回”按钮
九、XML整体框架
1.主界面
2.添加、修改界面
十、JAVA整体框架
1.NotepadBean(记录的实体信息)
(1)定义记录的id、内容、保存记录的时间
(2)三个get set方法
2.NotepadAdapter(自定义适配器)
(1)继承BaseAdapter
(2)定义XML布局对象(item_XML布局)、实体信息对象(NotepadBean.java)
private LayoutInflater layoutInflater;
private List<NotepadBean> list;
(3)构造方法
(4)重写item数量、位置、Id、View的get方法
- 实现getView()方法:套路+获取实体信息实例+获取两个控件实例
(5)定义Item布局类(把item_XML的两个TextView放进去)
- 实现findViewById()
3.DBUtils(数据库的基本定义)
(1)定义数据库名称、表名、版本
public static final String DATABASE_NAME = "Notepad";//数据库名
public static final String DATABASE_TABLE = "Note"; //表名
public static final int DATABASE_VERION = 1; //数据库版本
(2)定义数据库的列名:id、内容、时间
public static final String NOTEPAD_ID = "id";//记录的id
public static final String NOTEPAD_CONTENT = "content";//记录的内容
public static final String NOTEPAD_TIME = "notetime";//保存记录的时间
(3)获取系统时间的方法
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);
}
4.SQLiteHelper(创建数据库)
(1)定义数据库
private SQLiteDatabase sqLiteDatabase;
(2)创建数据库(构造方法)
(3)重写创建表(重写onCreate()方法)
(4)重写更新表(重写onUpgrade)
(5)增删改查()
//添加数据
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<NotepadBean> query() {
List<NotepadBean> list = new ArrayList<NotepadBean>();
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();
String id = String.valueOf(cursor.getInt
(cursor.getColumnIndex(DBUtils.NOTEPAD_ID)));
String content = cursor.getString(cursor.getColumnIndex
(DBUtils.NOTEPAD_CONTENT));
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;
}
5.RecordActivity(记录界面)
(1)声明第二界面控件、数据库
(2)重写oncreate()方法
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); }加载xml布局文件:setContentView(R.layout.~)findViewById点击事件:.setOnClickListener(this)initData();
(3)初始化数据:数据库(initData();)
创建数据库:mSQLiteHelper = new SQLiteHelper(this);获取Intent对象:Intent intent = getIntent();添加、修改标题的更改setText()
判断进入记录界面时是添加还是修改
(4)重写监听:“保存”、“清空”、“返回”按钮实现点击事件
@Override public void onClick(View v) { }用switch case 判断点击哪个键触发什么操作
(5)显示操作信息
public void showToast(String message){
Toast.makeText(RecordActivity.this,message,Toast.LENGTH_SHORT).show();
}
6.NotepadActivity(主界面)
(1)继承Activity
(2)声明控件、数据库、实体信息、适配器
(3)重写oncreate()方法
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); }加载xml布局文件:setContentView(R.layout.~)findViewById点击事件(匿名内部类): .setOnClickListener((v)->{ Intent intent = new Intent(NotepadActivity.this,RecordActivity.class); startActivityForResult(intent, 1);//跳转到添加记录界面 });initData();
(3)初始化数据:数据库(initData()?
创建数据库:mSQLiteHelper = new SQLiteHelper(this);调用数据库数据showQueryData();
点击列表的触发器:匿名内部类实现事件监听(实现查看记录的功能): listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { });长按删除item记录: listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { })
(4)定义调用数据库数据
private void showQueryData(){
if (list!=null){
list.clear();//清除了对象的引用
}
//从数据库中查询数据(保存的标签)
list = mSQLiteHelper.query();//查询数据库中保存的记录数据
adapter = new NotepadAdapter(this, list);//获得获取的记录数据
listView.setAdapter(adapter);//调用自定义适配器
}
(5)重写关闭添加、修改页面返回主页面时的显示:
@Override
protected void onActivityResult(int requestCode,int resultCode, Intent data){
}