基于Android简单备忘录的设计与实现(附git源码链接)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zouguo1211/article/details/83474845

前言

课程作业需要,于是忙活两天写了一个简单的备忘录,使用了ListView,SQLite。

开发环境:Android Studio

源码链接:https://gitee.com/zg0212/Memoire

功能截图

  • 主页面

  • 新建页面

  • 主页面长按删除

还有些比如修改页面等弹窗就不一一展示了,话不多说,来看实现思路。

开始写代码

思路

备忘录有一个主页面(main_linear_layout.xml)、新建页面(edit_linear_layout.xml)、修改页面(amend_linear_layout.xml),在主页面展示已经存储的记录,这里我选择使用ListView控件,所以还需要加一个list_item.xml文件。

这里具体讲一下ListView布局,因为是不能够直接在<ListView></ListView>里直接添加其他组件的,需要用一个自定义的适配器(adapter)去作为桥梁连接。

在主页面的布局文件里只需要添加上ListView,并设置宽高、位置即可;

然后在item_list.xml文件里添加条目的布局,这里每一条数据会有三部分组成,即标题、内容和创建时间,具体代码如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    >
    <TextView
        android:id="@+id/list_item_title"
        android:layout_width="180dp"
        android:layout_height="40dp"
        android:textSize="20sp"
        android:textColor="@color/colorAccent"
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:gravity="start|bottom"
        android:focusable="false"
        android:maxLength="10"
        android:maxLines="1"
         />
    <TextView
        android:id="@+id/list_item_time"
        android:layout_width="wrap_content"
        android:layout_height="40dp"
        android:layout_toRightOf="@id/list_item_title"
        android:layout_toEndOf="@id/list_item_title"
        android:layout_alignBottom="@id/list_item_title"
        android:textColor="#123"
        android:textSize="15sp"
        android:gravity="start|bottom"
        android:focusable="false"
        android:maxLines="1"
        android:maxLength="18"
         />
    <TextView
        android:id="@+id/list_item_body"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:layout_below="@id/list_item_title"
        android:textSize="20sp"
        android:layout_marginBottom="10dp"
        android:textColor="@color/colorPrimaryDark"
        android:gravity="start|bottom"
        android:focusable="false"
        android:maxLines="1"
        android:maxLength="30"
        />
</RelativeLayout>

以上ListView仅供参考,并不唯一;其他模块的布局,也按照各自喜好即可,下面开始讲Activity;

Activity

Activity为用户提供可视化界面及操作,一个应用程序通常包括多个Activity,每个Activity负责管理一个用户界面,这些界面可以添加多个控件,来实现不同的功能。

前面所说的三个页面分别也有三个activity文件与之对应,主页面(MainActivity.java)、新建页面(EditActivity.java)、修改页面(AmendActivity),在这三个Java文件里各自都实现了一些事件的监听,数据库的操作,以及跳转逻辑。

这里我还创建了一个BaseActivity.java文件,是用来设置一些通用属性的,比如我在这个程序中设置了一个强制竖屏

在使用的时候,只需要让其他Activity继承BaseActivity即可;

Intent(意图)

在讲这三个Activity之前,先简单的说一下Intent的相关简介;

一个程序有多个界面组成,即多个Activity,在界面进行跳转的时候,事实上就是Activity之间的跳转,而这里就要使用Intent,它可以指定当前组件要执行的动作,也可以在不同组件之间进行数据传递。关于显式意图和隐式意图的具体使用,这里不在赘述。

实现

首先,在MainActivity里,需要定义成员对象有:数据库类(MyDB),ListView,以及自定义的适配器类(MyBaseAdapter)的对象,其中MyBaseAdapter是ListView展示数据所需要的适配器类,继承于BaseAdapter类,需要实现getCount()、getItem()、getItemId()、getView()这四个抽象方法,具体定义请参照源码。

MainActivity:

  • init函数,数据库的查询,适配器的创建

 数据查询和适配器的创建操作:

数据查询:使用Cursor对象,注意循环方式,最好使用moveToNext方式;注意查询结束后需要close掉db,避免内存持续消耗。

适配器创建:通过List集合将数据传入,这里的record是自定义的数据实体,封装了id,titleName,textVBody,createTime四个成员属性。

  • 新建按钮的点击事件(新建备忘)

新建按钮点击,进行页面跳转:

先创建一个Intent对象,第一个参数Context表示当前Activity,传入当前this即可;第二个参数是要跳转的目标Activity的class,然后调用startActivity()方法,启动跳转;最后finish()掉当前Activity;

另外,跳转需要在 AndroidManifest.xml文件的application里配置<activity>

  • ListView里条目的点击事件(点击编辑)

 点击条目,跳转的编辑页面进行更改。这里需要实现AdapterView.OnItemClickListener接口里的onItemClick()方法,既然要修改,那肯定是将原始数据到目标页面,所以这里是一个带数据传递的跳转,为了简单化,就直接传四个属性了,也是可以传递对象的,有兴趣的码友可以尝试实现;

启动跳转,同样不要忘记finish()掉当前activity

  • ListView里条目的长按事件(长按删除)

长按某一条记录,然后弹出询问框进行删除。这里需要实现的是AdapterView.OnItemLongClickListener接口里的onItemLongClick()方法。方法实现是找到目标记录,然后通过一个dialog弹窗,具体逻辑在dialog里实现;

确认删除的时候,根据Id删除指定数据,然后需要对当前的主页面里的数据进行刷新,这里踩了许多坑,所以多说两句。

主页面的刷新逻辑:

数据展示的实现有两种基础逻辑

一种是:在MainActivity里定义的一个全局List<Record> recordList集合,然后查询之后,存入recordList集合中,在适配器需要展示的时候,再通过下标值去从recordList集合中取出。

另一种是:定义临时recordList集合,然后在适配器里定义数据集合,在初始化适配器的时候传入数据集合。

两种操作均可以显示成功,这里我们推荐第二种方式。

一般我们都会使用notifyDataSetChanged()方法来进行ListView的刷新,这个刷新的原理大致上就是,对ListView的中的数据集合中的每一个索引进行检测,如果有修改就会刷新,反之不会刷新;

这里需要注意的是,在调用notifyDataSetChanged()方法之前,我执行了一步removeItem操作,这个是自己定义的方法,删除掉数据集合中指定position位置的元素。因为不执行这个操作的话,相当于是,当前状态下只是数据库没有了这条数据,而集合里未从数据库里重新读取删除之后的数据,那么当执行notifyDataChanged方法进行刷新时,对数据集合检测是没有变化的,所以是不会刷新的,这里是一个坑。

EditActivity:

新建页面的逻辑相对比较简单,title和body是编辑框,time是一个文本框,从后台直接获得当前时间即可;

点击事件的逻辑

保存按钮:调用saveFunction(),获得返回值,成功则返回主界面

返回按钮:对当前编辑框进行检测,如果title或者body不为空,则询问是否保存当前编辑内容,在dialog里调用saveFunction()

附:saveFunction()实现

AmendActivity:

更新界面,就是拿到已有数据,在初始化时候填充到组件中,然后这里没有做那么细致,在返回的时候,无论是否做干过修改都会进行询问是否保存。

细节:只允许修改文本内容,即标题和时间都不能手动修改,在执行更新操作时,时间会进行更新,获得当前时间,否则时间不会更新。

附:updateFunction()

总结

基本的备忘录操作到这里就完成了,核心代码也已经贴出来了,花费两天时间,做出了这最基础的实现。其中还有很多地方需要优化的,比如数据传输,Intent跳转等等。另外这里面还有一些小细节没有细讲,比如对系统返回键的监听处理,对dialog的状态监听,都在源码里有实现。实现的方法有的可能也有不妥,还望有大佬可以指出,源码已经上传gitee,供有需要的同学参考。

源码:Gitee链接

我的邮箱:[email protected]

转载请注明出处:https://blog.csdn.net/zouguo1211/article/details/83474845

 

猜你喜欢

转载自blog.csdn.net/zouguo1211/article/details/83474845