这个例子主要是使用android开发出一个简单的记事本应用,可以实现数据的增加、修改以及删除等操作。
主要参考:哔哩哔哩up主:子林android。

主要涉及的相关知识:
1、控件RecyclerView的使用
2、轻量级数据库SQLite的使用
3、activity之间的跳转以及参数传递
首先创建MainActivity
为方便这里使用的是帧布局FrameLayout,主要包含两个控件,一个是用于显示记事本相关信息的RecyclerView,另一个是用于进行添加记事信息FloatingActionButton按钮,布局文件代码如下:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><androidx.recyclerview.widget.RecyclerViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:id="@+id/rlv"/><com.google.android.material.floatingactionbutton.FloatingActionButtonandroid:id="@+id/btn_add"android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/ic_baseline_add_24"android:layout_gravity="bottom|right"android:layout_margin="20dp"android:background="@color/green_200"android:onClick="add"/>
</FrameLayout>

接下来是对应的Java代码。首先是控件的一些初始化工作,这些在onCreate()函数中的 initView()中完成,MainActivity的对应代码如下:

public class MainActivity extends AppCompatActivity {private final String DB_Name="mySQLite.db";private RecyclerView mRecyclerView;private FloatingActionButton mButton;private List<NewsBean> newsBeanList;private NewsAdapter newsAdapter;private MySQILOpenHelper mySQILOpenHelper;@RequiresApi(api = Build.VERSION_CODES.N)@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();initData();initEvent();}@Overrideprotected void onResume() {super.onResume();refreshDataFromDB();}private void refreshDataFromDB() {newsBeanList=getDataFromDB();newsAdapter.refreshData(newsBeanList);}private void initEvent() {newsAdapter=new NewsAdapter(newsBeanList,this);mRecyclerView.setAdapter(newsAdapter);LinearLayoutManager layoutManager=new LinearLayoutManager(this);mRecyclerView.setLayoutManager(layoutManager);}private void initData() {newsBeanList= new ArrayList<>();mySQILOpenHelper=new MySQILOpenHelper(this);newsBeanList=getDataFromDB();}private List<NewsBean> getDataFromDB() {return newsBeanList=mySQILOpenHelper.query();}private void initView() {mRecyclerView=findViewById(R.id.rlv);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.menu_main,menu);SearchView searchView= (SearchView) menu.findItem(R.id.menu_serach).getActionView();searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {@Overridepublic boolean onQueryTextSubmit(String query) {return false;}@Overridepublic boolean onQueryTextChange(String newText) {List<NewsBean> List = mySQILOpenHelper.queryByTitle(newText);newsAdapter.refreshData(List);return true;}});return super.onCreateOptionsMenu(menu);}@Overridepublic boolean onOptionsItemSelected(@NonNull MenuItem item) {return super.onOptionsItemSelected(item);}public void add(View view) {Intent intent=new Intent(MainActivity.this,AddActivity.class);startActivity(intent);}
*

注意:当其他Activity跳转到MainActivity时,由于生命周期的原因,onCreate()函数不在执行,因此此时必须重写onResume() 函数,在onResume()中重新查询数据库相关操作,并刷新当前适配器adapter对应数据,否则MainActivity界面不会有显示信息。

其次,RecyclerView的实现还需相关的数据源,以及两者之间的桥梁适配器adapter。记事本主要有三部分信息:标题、内容和创建时间。此处我们用一个标准的JavaBean类来封装这个实体类,并使其实现Serializable从而用于后文中activity之间跳转时自定义参数的传递,代码如下:


public class NewsBean implements Serializable {
private String title;
private String content;
private String createdTime;
private int id;
public String getTitle() {
return title;
}

public void setTitle(String title) {this.title = title;
}public String getContent() {return content;
}public void setContent(String content) {this.content = content;
}public String getCreatedTime() {return createdTime;
}public void setCreatedTime(String createdTime) {this.createdTime = createdTime;
}public int getId() {return id;
}public void setId(int id) {this.id = id;
}@Override
public String toString() {return "NewsBean{" +"title='" + title + '\'' +", content='" + content + '\'' +", createdTime='" + createdTime + '\'' +", id=" + id +'}';
}
接下来定义一个名为NewsAdapter的适配器,继承自 RecyclerView.Adapter,代码如下,其中适配器中用到了一个布局文件new_layout.xml,用于指定记事本信息显示格式如下:![在这里插入图片描述](https://img-blog.csdnimg.cn/1d8aa91ddada44e2a7a8623160859837.png)
适配器NewsAdapter的代码如下

public class NewsAdapter extends RecyclerView.Adapter<NewsAdapter.MyViewHolder> {
private List newsBeanList;
private LayoutInflater layoutInflater;
private Context context;

public NewsAdapter(List<NewsBean> newsBeanList, Context context) {this.newsBeanList = newsBeanList;this.context = context;layoutInflater=LayoutInflater.from(context);
}@Override
public int getItemCount() {return newsBeanList.size();
}@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {View view = layoutInflater.inflate(R.layout.new_layout, parent, false);MyViewHolder myViewHolder=new MyViewHolder(view);return myViewHolder;
}@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, @SuppressLint("RecyclerView") int position) {NewsBean newsBean = newsBeanList.get(position);holder.tvContent.setText(newsBean.getContent());holder.tvTitle.setText(newsBean.getTitle());holder.tvTime.setText(newsBean.getCreatedTime());holder.rlContainer.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent=new Intent(context, EditActivity.class);intent.putExtra("new",newsBean);context.startActivity(intent);}});holder.rlContainer.setOnLongClickListener(new View.OnLongClickListener() {@Overridepublic boolean onLongClick(View v) {Dialog dialog=new Dialog(context,android.R.style.ThemeOverlay_Material_Dialog_Alert);View view = layoutInflater.inflate(R.layout.diag_layout, null);TextView tvDelete=view.findViewById(R.id.tv_delete);TextView tvEdit=view.findViewById(R.id.tv_edit);tvDelete.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {int row = mySQILOpenHelper.deleteFromDbById(newsBean.getId());if(row>0){deleteData(position);Toast.makeText(context,"删除成功",Toast.LENGTH_SHORT).show();}else {Toast.makeText(context,"删除失败",Toast.LENGTH_SHORT).show();}dialog.dismiss();}});tvEdit.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent=new Intent(context, EditActivity.class);intent.putExtra("new",newsBean);context.startActivity(intent);dialog.dismiss();}});dialog.setContentView(view);dialog.show();return true;}});
}public void refreshData(List<NewsBean>list){this.newsBeanList=list;notifyDataSetChanged();//notifyDataSetChanged();}public void deleteData(int position){newsBeanList.remove(position);notifyItemRemoved(position);
}class MyViewHolder extends RecyclerView.ViewHolder{TextView tvTitle,tvContent,tvTime;ViewGroup rlContainer;public MyViewHolder(@NonNull View itemView) {super(itemView);this.tvTime=itemView.findViewById(R.id.tv_time);this.tvContent=itemView.findViewById(R.id.tv_content);this.tvTitle=itemView.findViewById(R.id.tv_title);this.rlContainer=itemView.findViewById(R.id.rl_item_container);}
}

}


上述代码中,在viewHolder中为new_layout.xml整个区域设计了长按弹对话框模式(包含删除和编辑当前记事本信息),以及短按跳转至编辑界面的点击事件。

接下来是编辑界面和添加界面
分别创建名为AddActivity和EditActivity两个Activity,两个界面基本一致,界面如下:

对应的布局文件xml比较简单,详细代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".EditActivity"android:orientation="vertical"android:padding="10dp"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:gravity="center_vertical"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="标题"android:textSize="30sp"/><EditTextandroid:padding="5dp"android:background="@drawable/edit_bg"android:id="@+id/et_edit_title"android:layout_width="match_parent"android:layout_height="40dp"android:layout_marginLeft="10dp"/></LinearLayout><LinearLayoutandroid:layout_marginTop="10dp"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="内容"android:textSize="30sp"/><EditTextandroid:padding="5dp"android:layout_marginTop="10dp"android:id="@+id/et_edit_content"android:layout_width="match_parent"android:layout_height="250dp"android:background="@drawable/edit_bg"/></LinearLayout><Buttonandroid:layout_marginTop="10dp"android:id="@+id/save"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="@drawable/btn_bg"android:text="保存"android:textSize="25sp"android:textColor="@color/white"android:onClick="save"/>
</LinearLayout>

接下来最重要的就是数据库SQLite的创建,这里使用数据库帮助类SQLiteOpenHelper 来实现,包含了增,删,改和查四种操作,其代码如下:

public class MySQILOpenHelper extends SQLiteOpenHelper {private static final String DB_Name="mySQLite.db";private static final String TABLE_NAME="note";private static final String sql="create table "+TABLE_NAME+" (id integer primary key autoincrement,title text,content,text,createdTime text)";public MySQILOpenHelper(Context context){super(context,DB_Name,null,1);}/*public MySQILOpenHelper(Context context,String name){super(context,name,null,1);}*/@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL(sql);}public long insertData(NewsBean newsBean){SQLiteDatabase db=getWritableDatabase();ContentValues value=new ContentValues();value.put("title",newsBean.getTitle());value.put("content",newsBean.getContent());value.put("createdTime",newsBean.getCreatedTime());return db.insert(TABLE_NAME,null,value);}public int updateData(NewsBean newsBean){//Log.d("TAG", "updateData: "+newsBean);SQLiteDatabase db=getWritableDatabase();ContentValues value=new ContentValues();//value.put("id",newsBean.getId());value.put("title",newsBean.getTitle());value.put("content",newsBean.getContent());value.put("createdTime",newsBean.getCreatedTime());return db.update(TABLE_NAME,value,"id like ?",new String[]{String.valueOf(newsBean.getId())});}public List<NewsBean> query(){SQLiteDatabase db=getWritableDatabase();List<NewsBean>newsBeanList=new ArrayList<>();Cursor cursor = db.query(TABLE_NAME, null, null, null, null, null, null);if(cursor!=null){while ((cursor.moveToNext())){@SuppressLint("Range") int id=Integer.parseInt(cursor.getString(cursor.getColumnIndex("id")));@SuppressLint("Range") String title=cursor.getString(cursor.getColumnIndex("title"));@SuppressLint("Range") String content=cursor.getString(cursor.getColumnIndex("content"));@SuppressLint("Range") String createdTime=cursor.getString(cursor.getColumnIndex("createdTime"));NewsBean newsBean=new NewsBean();newsBean.setId(id);newsBean.setCreatedTime(createdTime);newsBean.setContent(content);newsBean.setTitle(title);newsBeanList.add(newsBean);}cursor.close();}return newsBeanList;}public List<NewsBean> queryByTitle(String title1){if(TextUtils.isEmpty(title1)){return query();}SQLiteDatabase db=getWritableDatabase();List<NewsBean>newsBeanList=new ArrayList<>();Cursor cursor = db.query(TABLE_NAME, null, "title like ?", new String[]{"%"+title1+"%"}, null, null, null);if(cursor!=null){while ((cursor.moveToNext())){@SuppressLint("Range") int id=Integer.parseInt(cursor.getString(cursor.getColumnIndex("id")));//@SuppressLint("Range") String id=cursor.getString(cursor.getColumnIndex("id"));@SuppressLint("Range") String title=cursor.getString(cursor.getColumnIndex("title"));@SuppressLint("Range") String content=cursor.getString(cursor.getColumnIndex("content"));@SuppressLint("Range") String createdTime=cursor.getString(cursor.getColumnIndex("createdTime"));NewsBean newsBean=new NewsBean();newsBean.setId(id);newsBean.setCreatedTime(createdTime);newsBean.setContent(content);newsBean.setTitle(title);newsBeanList.add(newsBean);}cursor.close();}return newsBeanList;}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}public int deleteFromDbById(int id) {SQLiteDatabase db=getWritableDatabase();return db.delete(TABLE_NAME,"id like ?",new String[]{String.valueOf(id)});}
}

写到这里,基本上已经完成了一个简单记事本APP的开发,最后运行成功的界面如下:



实现一个简单的记事本APP相关推荐

  1. 在iOS中实现一个简单的画板App

    在这个随笔中,我们要为iPhone实现一个简单的画板App. 首先需要指出的是,这个demo中使用QuarzCore进行绘画,而不是OpenGL.这两个都可以实现类似的功能,区别是OpenGL更快,但 ...

  2. 一个简单的天气预报APP

    运行效果 一个简单的天气预报APP 项目代码 https://gitee.com/fakerxuan/weather

  3. Flutter For App——一个简单的豆瓣APP

    一个简单的豆瓣APP 效果视频 功能简述 功能 第三方库 接口简述 底部导航栏 效果图 实现 初始化BottomNavigationBarItem bottomNavigationBar 切换页面导致 ...

  4. Android——一个简单的音乐APP(二)

    一个简单的音乐APP 效果视频 前言 音乐下载 音乐下载效果图 实习步骤&思想 添加到下载队列 单任务下载 多任务下载 音乐下载 获取音乐下载源 创建本地路径 创建目录 开始音乐下载 下载进度 ...

  5. 用Android Studio设计的一个简单的闹钟APP

    该闹钟是用Android Studio为安卓手机设计的一个简单的闹钟APP 一.介绍系统的设计界面 闹钟的布局文件代码如下 <?xml version="1.0" encod ...

  6. 编写一个简单的生日快乐APP

    编写一个简单的生日快乐APP 一.关闭之前的helloworld程序 点击file,然后close project,就完成关闭了. 二.创建一个新的happybirthday程序 三.下面开始整个AP ...

  7. 一个html写的app首页,如何快速开发一个简单好看的APP控制页面

    原标题:如何快速开发一个简单好看的APP控制页面 导读 机智云开源框架为了让开发者快速开发APP,已将用户登录,设备发现,设备配网等功能做成了各个标准模块,仅保留控制页面让开发者自行开发设计,节省了开 ...

  8. 一个简单的手电筒APP源码分享(支持Android O(8.0)及以下版本)

    一个简单的手电筒APP(无闪光灯的设备开启屏幕照明模式) GitHub地址: https://github.com/djzhao627/SimpleTorch 打包下载 http://download ...

  9. Android——一个简单的天气APP

    一个简单的天气APP 效果演示视频 简述 天气JSON数据 实况天气 逐24小时天气预报 未来七天天气预报 天气详情页 效果图 获取JSON数据 URL请求 实况天气URL 逐24小时天气预报URL ...

  10. 『牛角书』HarmonyOS鸿蒙实战 开发一个简单聊天助手APP

    前言 我是通过b站上面老师的讲解,跟着老师编写了一个简单聊天助手app,简答实用,对于刚开始接触鸿蒙的我们来说很有帮助. 创建项目 所用软件为DevEco Studio,点击Create Harmon ...

最新文章

  1. 典型用户 persona
  2. Tableau 绘制折线图
  3. JSON API免费接口
  4. 病毒在网络上传播的基本途径分析
  5. 老男孩linux培训期中学生作业文档目录展示
  6. 智慧海洋建设TOP方案借鉴学习与整理
  7. 罗斯文2007(Northwind 2007)数据库、Access 2007 样列数据库分析[转]
  8. 启动ipython内核发生错误_ipython3启动
  9. LeetCode(762)——二进制表示中质数个计算置位(JavaScript)
  10. ui自动化测试框架_自动化测试框架--Instrumentation
  11. Python 完整学习路线,非常赞!
  12. ubuntu PHP Cannot adopt OID in UCD-SNMP-MIB
  13. php 对账单系统,微信支付PHP开发教程八下载对账单
  14. NOJ 水獭看动漫 2001
  15. JS实现点击表头表格自动排序(含数字、字符串、日期)
  16. 网红KOL营销怎么做?如何寻找合适的网红KOL?
  17. WebGL 2.0实现Vertex Array Objects(VAO,顶点数组对象)
  18. Redis 设计与实现 1:数据库 redisDb
  19. 人脸识别系统的实现与封装
  20. 剖析Mozilla代码之七武器

热门文章

  1. w10控制面板卸载java_手把手教你解决Win10控制面板无法卸载软件的问题
  2. ruoyi第三方登入Gitee
  3. 局域网监控软件——邮件监控
  4. Computer Vision的尴尬---by林达华
  5. CoffeeScript 详解
  6. IDEA中出现java file outside of source root
  7. 网易云那些触动人心的经典热评
  8. Python Flask 学习笔记 —— 二(路由,视图函数,jinjia2语法)
  9. uniapp中scroll-view的下拉刷新
  10. 使用puppet自动化升级安全程序