Android的Notepad记事本案例实战

一、搭建记事本布局

效果图:

在这里插入图片描述
在这里插入图片描述

(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()方法
  • 套路:关联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){
    }

版权声明:本文为moyiyanting原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。