listview与SQLite结合实现记事本功能

android记事本的demo在网上一搜一大堆,但是大神写的demo往往功能太多导致新手难以着手,很难啃得动;而一些新手写的demo又往往是东拼西凑,代码很多都是copy的别人的,直接放在项目里面用,也不知道代码有什么作用。往往代码特别丑,重复性的代码也比较多。

笔者近期学到此处,自己理解之后也还是打算写个demo供新手学习一下。代码说不上优雅,但在笔者看来已经尽力去让人容易理解了。(源码在文章结尾)

为了便于新手学习,在此也是罗列一下涉及的知识点:
1、SQLite的基本使用,增删查改
2、listview,adapeter的基本使用
3、activity生命周期
4、intent、bundle传递参数
5、AlertDialog的基本使用

另外还有一些零碎知识点都可以百度到。

遇到的问题:

SQlite有个问题,就是主键不能够自动排序。比如说主键id为1 2 3 4,共4条记录。现在删除2 3,还剩下1 4记录,当再次插入时,id会变成5,而不是2.假设在初始4条记录的基础上,把这4条记录全都删掉,再次插入时,得到的id是5.
笔者在这点上也是花了比较久的时间,原本为了精简代码,想法是用listview中的arg2直接通过数据库记录的id进行操作,但是由于SQLite的这个问题,所以这种方法就有问题了。
最终,笔者采用的是内容搜索的方法,从listview的每个item中获取内容,然后到数据库中通过内容搜索该记录,最后对其进行操作。

效果:

MainActivity:

import android.app.Activity;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView; 

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; 

public class MainActivity extends Activity implements
  OnItemClickListener, OnItemLongClickListener { 

 private ListView listview;
 private SimpleAdapter simple_adapter;
 private List<Map<String, Object>> dataList;
 private Button addNote;
 private TextView tv_content;
 private NoteDateBaseHelper DbHelper;
 private SQLiteDatabase DB; 

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main); 

  InitView();
 } 

 //在activity显示的时候更新listview
 @Override
 protected void onStart() {
  super.onStart();
  RefreshNotesList();
 } 

 private void InitView() {
  tv_content = (TextView) findViewById(R.id.tv_content);
  listview = (ListView) findViewById(R.id.listview);
  dataList = new ArrayList<Map<String, Object>>();
  addNote = (Button) findViewById(R.id.btn_editnote);
  DbHelper = new NoteDateBaseHelper(this);
  DB = DbHelper.getReadableDatabase(); 

  listview.setOnItemClickListener(this);
  listview.setOnItemLongClickListener(this);
  addNote.setOnClickListener(new OnClickListener() { 

   @Override
   public void onClick(View arg0) {
    Intent intent = new Intent(MainActivity.this, noteEdit.class);
    Bundle bundle = new Bundle();
    bundle.putString("info", "");
    bundle.putInt("enter_state", 0);
    intent.putExtras(bundle);
    startActivity(intent);
   }
  });
 } 

 //刷新listview
 public void RefreshNotesList() {
  //如果dataList已经有的内容,全部删掉
  //并且更新simp_adapter
  int size = dataList.size();
  if (size > 0) {
   dataList.removeAll(dataList);
   simple_adapter.notifyDataSetChanged();
  } 

  //从数据库读取信息
  Cursor cursor = DB.query("note", null, null, null, null, null, null);
  startManagingCursor(cursor);
  while (cursor.moveToNext()) {
   String name = cursor.getString(cursor.getColumnIndex("content"));
   String date = cursor.getString(cursor.getColumnIndex("date"));
   Map<String, Object> map = new HashMap<String, Object>();
   map.put("tv_content", name);
   map.put("tv_date", date);
   dataList.add(map);
  }
  simple_adapter = new SimpleAdapter(this, dataList, R.layout.item,
    new String[]{"tv_content", "tv_date"}, new int[]{
    R.id.tv_content, R.id.tv_date});
  listview.setAdapter(simple_adapter);
 } 

 // 点击listview中某一项的点击监听事件
 @Override
 public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
  //获取listview中此个item中的内容
  String content = listview.getItemAtPosition(arg2) + "";
  String content1 = content.substring(content.indexOf("=") + 1,
    content.indexOf(",")); 

  Intent myIntent = new Intent(MainActivity.this, noteEdit.class);
  Bundle bundle = new Bundle();
  bundle.putString("info", content1);
  bundle.putInt("enter_state", 1);
  myIntent.putExtras(bundle);
  startActivity(myIntent); 

 } 

 // 点击listview中某一项长时间的点击事件
 @Override
 public boolean onItemLongClick(AdapterView<?> arg0, View arg1, final int arg2,
         long arg3) {
  Builder builder = new Builder(this);
  builder.setTitle("删除该日志");
  builder.setMessage("确认删除吗?");
  builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
   @Override
   public void onClick(DialogInterface dialog, int which) {
    //获取listview中此个item中的内容
    //删除该行后刷新listview的内容
    String content = listview.getItemAtPosition(arg2) + "";
    String content1 = content.substring(content.indexOf("=") + 1,
      content.indexOf(","));
    DB.delete("note", "content = ?", new String[]{content1});
    RefreshNotesList();
   }
  });
  builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
   @Override
   public void onClick(DialogInterface dialog, int which) {
   }
  });
  builder.create();
  builder.show();
  return true;
 }

NoteDateBaseHelper:

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper; 

public class NoteDateBaseHelper extends SQLiteOpenHelper { 

 public static final String CreateNote = "create table note ("
   + "id integer primary key autoincrement, "
   + "content text , "
   + "date text)"; 

 public NoteDateBaseHelper(Context context) {
  super(context, "note", null, 1);
 } 

 @Override
 public void onCreate(SQLiteDatabase db) {
  db.execSQL(CreateNote);
 } 

 @Override
 public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
  // TODO Auto-generated method stub 

 } 

}

noteEdit:

import android.app.Activity;
import android.content.ContentValues;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast; 

import java.text.SimpleDateFormat;
import java.util.Date; 

public class noteEdit extends Activity implements OnClickListener {
 private TextView tv_date;
 private EditText et_content;
 private Button btn_ok;
 private Button btn_cancel;
 private NoteDateBaseHelper DBHelper;
 public int enter_state = 0;//用来区分是新建一个note还是更改原来的note
 public String last_content;//用来获取edittext内容 

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.edit); 

  InitView();
 } 

 private void InitView() {
  tv_date = (TextView) findViewById(R.id.tv_date);
  et_content = (EditText) findViewById(R.id.et_content);
  btn_ok = (Button) findViewById(R.id.btn_ok);
  btn_cancel = (Button) findViewById(R.id.btn_cancel);
  DBHelper = new NoteDateBaseHelper(this); 

  //获取此时时刻时间
  Date date = new Date();
  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
  String dateString = sdf.format(date);
  tv_date.setText(dateString); 

  //接收内容和id
  Bundle myBundle = this.getIntent().getExtras();
  last_content = myBundle.getString("info");
  enter_state = myBundle.getInt("enter_state");
  et_content.setText(last_content); 

  btn_cancel.setOnClickListener(this);
  btn_ok.setOnClickListener(this);
 } 

 @Override
 public void onClick(View view) {
  switch (view.getId()) {
   case R.id.btn_ok:
    SQLiteDatabase db = DBHelper.getReadableDatabase();
    // 获取edittext内容
    String content = et_content.getText().toString(); 

    // 添加一个新的日志
    if (enter_state == 0) {
     if (!content.equals("")) {
      //获取此时时刻时间
      Date date = new Date();
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
      String dateString = sdf.format(date); 

      //向数据库添加信息
      ContentValues values = new ContentValues();
      values.put("content", content);
      values.put("date", dateString);
      db.insert("note", null, values);
      finish();
     } else {
      Toast.makeText(noteEdit.this, "请输入你的内容!", Toast.LENGTH_SHORT).show();
     }
    }
    // 查看并修改一个已有的日志
    else {
     ContentValues values = new ContentValues();
     values.put("content", content);
     db.update("note", values, "content = ?", new String[]{last_content});
     finish();
    }
    break;
   case R.id.btn_cancel:
    finish();
    break;
  }
 }
}

activity_main:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:orientation="vertical" > 

 <TextView
  android:layout_height="wrap_content"
  android:layout_width="fill_parent"
  android:text="记事本"
  android:textStyle="bold"
  android:textSize="22sp"
  android:padding="15dp"
  android:background="#000"
  android:textColor="#fff"
  /> 

 <LinearLayout
  android:layout_width="fill_parent"
  android:layout_height="0dp"
  android:layout_weight="1" > 

  <ListView
   android:id="@+id/listview"
   android:layout_margin="5dp"
   android:layout_width="match_parent"
   android:layout_height="wrap_content" >
  </ListView>
 </LinearLayout> 

 <Button
  android:id="@+id/btn_editnote"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:text="添加备忘录"
  android:padding="10dp"
  android:textSize="20sp" /> 

</LinearLayout> 

edit:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical"> 

 <LinearLayout
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:background="#000"
  android:orientation="vertical" 

  android:padding="15dp"> 

  <TextView
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:text="编辑备忘录"
   android:textColor="#fff"
   android:textSize="22sp"
   android:textStyle="bold" /> 

  <TextView
   android:id="@+id/tv_date"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:gravity="end"
   android:text="编辑时间"
   android:textColor="#fff" />
 </LinearLayout> 

 <LinearLayout
  android:layout_width="match_parent"
  android:layout_height="0dp"
  android:layout_weight="1"
  android:padding="10dp"
  android:orientation="vertical">
  <TextView
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:text="内容编辑:"
   android:textColor="#000"
   android:textSize="20sp"
   android:layout_margin="10dp"
   android:textStyle="bold" /> 

  <EditText
   android:id="@+id/et_content"
   android:layout_width="match_parent"
   android:layout_height="0dp"
   android:layout_weight="1"
   android:background="@drawable/edit_text_style"
   android:gravity="start"
   android:hint="此处记录备忘事件"
   android:textSize="20sp" /> 

  <LinearLayout
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:orientation="horizontal"> 

   <Button
    android:id="@+id/btn_cancel"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:text="取消" /> 

   <Button
    android:id="@+id/btn_ok"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:text="保存" /> 

  </LinearLayout>
 </LinearLayout> 

</LinearLayout> 

item:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:padding="10dp"
 android:orientation="vertical"> 

 <TextView
  android:id="@+id/tv_content"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:singleLine="true"
  android:textSize="20sp"
  android:textColor="#000"
  android:text="Large Text" /> 

 <TextView
  android:id="@+id/tv_date"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:text="TextView" /> 

</LinearLayout> 

最后附上源码:记事本

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • Android实现记事本功能
  • Android实现简易记事本
  • android实现记事本app
  • Android+SQLite数据库实现的生词记事本功能实例
  • Android中实现记事本动态添加行效果
  • Android实现记事本功能(26)
  • Android利用Intent实现记事本功能(NotePad)
(0)

相关推荐

  • Android利用Intent实现记事本功能(NotePad)

    本文实例为大家分享了Intent如何实现一个简单的记事本功能的演示过程,供大家参考,具体内容如下 1.运行截图 单击右上角[-]会弹出[添加]菜单项,长按某条记录会弹出快捷菜单[删除]项. 2.主要设计步骤 (1)添加引用 鼠标右击[引用]à[添加引用],在弹出的窗口中勾选"System.Data"和"System.Data.SQlite",如下图所示: 注意:不需要通过NuGet添加SQLite程序包,只需要按这种方式添加即可. (2)添加图片 到Android

  • Android中实现记事本动态添加行效果

    本文主要给大家介绍了关于Android实现记事本动态添加行的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍: 先看效果图: 这是昨天在群里面有人在问这个问题,在这里顺便记录一下,这个效果我们可以自定义EditText,实现起来也不难 看详细步骤: 第一:初始化Paint,这里肯定要用到画笔的 this.paint = new Paint(); paint.setStyle(Paint.Style.STROKE); paint.setColor(getResources().getCo

  • android实现记事本app

    自己写的一个简单的记事本app,效果如下: 一.首先是第一个界面的编写,最上面是一个TextView,中间是一个Linearlayout中嵌套一个listview布局,最下面是一个button.下面附上第一个页面的简单布局xml文件. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" androi

  • Android+SQLite数据库实现的生词记事本功能实例

    本文实例讲述了Android+SQLite数据库实现的生词记事本功能.分享给大家供大家参考,具体如下: 主activity命名为 Dict: 代码如下: package example.com.myapplication; import android.app.Activity; import android.content.Intent; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase;

  • Android实现简易记事本

    本文实例为大家分享了Android实现简易记事本的具体代码,供大家参考,具体内容如下 此次做的Android简易记事本的存储方式使用了SQLite数据库,然后界面的实现比较简单,但是,具有增删改查的基本功能,这里可以看一下效果图,如下: 具体操作就是长按可以删除操作,点击可以进行修改,点击添加笔记按钮可以添加一个笔记. 首先我们需要三个界面样式一个是我们的进入程序时的第一个界面,然后第一个界面里面有一个ListView,这个ListView需要一个xml来描述里面的各个元素,这也是第二个.还有一

  • Android实现记事本功能(26)

    本文实例为大家分享了Android实现记事本功能的具体代码,供大家参考,具体内容如下 MainActivity.java代码: package siso.smartnotef.activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.support.

  • Android实现记事本功能

    本文实例为大家分享了Android实现记事本功能的具体代码,供大家参考,具体内容如下 实现功能 1.文本数据的存储 2.图片数据存储 3.视频数据存储 4.自定义的Adapter 5.SQlite的创建 6.数据listview列表的显示 demo地址 记事本 界面布局 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.

  • listview与SQLite结合实现记事本功能

    android记事本的demo在网上一搜一大堆,但是大神写的demo往往功能太多导致新手难以着手,很难啃得动:而一些新手写的demo又往往是东拼西凑,代码很多都是copy的别人的,直接放在项目里面用,也不知道代码有什么作用.往往代码特别丑,重复性的代码也比较多. 笔者近期学到此处,自己理解之后也还是打算写个demo供新手学习一下.代码说不上优雅,但在笔者看来已经尽力去让人容易理解了.(源码在文章结尾) 为了便于新手学习,在此也是罗列一下涉及的知识点: 1.SQLite的基本使用,增删查改 2.l

  • Android手机开发设计之记事本功能

    本文实例为大家分享了Android手机开发设计之记事本功能,供大家参考,具体内容如下 一.需求分析 1.1业务需求分析 近年来,随着生活节奏的加快,工作和生活的双重压力全面侵袭着人们,如何避免忘记工作和生活中的诸多事情而造成不良的后果就显得非常重要.为此我们开发一款基于Android系统的简单记事本,其能够便携记录生活和工作对诸多事情,从而帮助人们有效地进行时间管理. 1.2功能需求分析 本记事本项目希望可以开发出一款符合用户生活工作习惯的简单应用,能够满足用户的各方面需求,可以对记事进行增加.

  • php基于SQLite实现的分页功能示例

    本文实例讲述了php基于SQLite实现的分页功能.分享给大家供大家参考,具体如下: 这里操作数据库文件使用的是前面文章<PHP基于PDO实现的SQLite操作类[包含增删改查及事务等操作]>中的SQLite数据库操作类.废话不说,直接上代码: <meta charset='utf-8'> <?php class SqlitePage{ public function __construct() { $this->table_name=''; $this->tj=

  • Android开发笔记SQLite优化记住密码功能

    本文实例为大家分享了Android SQLite优化记住密码功能的具体代码,供大家参考,具体内容如下 package com.example.alimjan.hello_world; /** * Created by alimjan on 7/4/2017. */ import com.example.alimjan.hello_world.bean.UserInfo; import com.example.alimjan.hello_world.dataBase.UserDBHelper; i

  • Java实现记事本功能

    今天给大家介绍一下关于如何用Java实现记事本功能,是学习Java swing的一个非常好的案例,下面先看一下运行结果: 下面我们来看源码: import java.awt.*; import java.awt.event.*; import java.text.*; import java.util.*; import java.io.*; import javax.swing.undo.*; import javax.swing.border.*; import javax.swing.*;

  • Android开发使用自定义view实现ListView下拉的视差特效功能

    本文实例讲述了Android开发使用自定义view实现ListView下拉的视差特效功能.分享给大家供大家参考,具体如下: 一.概述: 现在流型的APP如微信朋友圈,QQ空间,微博个人展示都有视差特效的影子. 如图:下拉图片会产生图片拉升的效果,放手后图片有弹回到原处: 那我们如何实现呢? 1)重写ListView控件: 2)重写里面的overScrollBy方法 3)在松手后执行值动画 二.具体实现: 1.创建ParallaListView 自定义ListView public class P

随机推荐