Android开发:ListView+SQLite实现一个简单的备忘录程序(ADT插件环境)
前話:明天要交安卓程序了,前幾天在自己的電腦上配置了一下安卓環境,但是項目無法編譯,原因好像是jdk版本過高,有一個包無法支持,然后換成1.8的jdk也不行,昨晚折騰到凌晨一點半也沒成功,今天借了同學的電腦,把之前構思的一個程序邏輯和代碼思路實現了一下。
該程序要實現的只有最簡單的幾個功能:
1.添加一個備忘錄
2.查看備忘錄列表
3.點擊某個備忘錄查看里面的信息
4.修改某個備忘錄的信息
5.刪除某個備忘錄
6.備忘錄的信息保存到數據庫中
編譯環境:SDK+ADT
程序運行功能展示:
主界面:
添加備忘錄:
編輯備忘錄信息"hello world"并保存:
查看備忘錄信息:
修改備忘錄信息為“very good!”:
最后刪除備忘錄信息,界面為空。
由于時間原因,本程序的不完美的地方主要有以下兩個:
1.在刪除某個備忘錄的信息后,希望能把刪除的備忘錄信息后面備忘錄的id號進行重新排序(比如有1,2,3條備忘錄信息,如果我要刪除掉2第二個備忘錄,希望再次打開備忘錄列表時,能顯示1,2),但是此程序沒有實現該功能。(實際上我寫了一段代碼:在點擊刪除按鈕之后,再讀一遍數據庫里的信息,將id號重新按照遞增差值為1的順序排好,但是失敗了,原因未知。)
2.在備忘錄列表里點擊某個具體的備忘錄信息后,也就是說由當前的activity-A跳轉到下一個activity-B,假設在activity-B里執行的操作為刪除,希望返回activity-A時,能夠自動更新備忘錄列表,將已經刪除的備忘錄在該列表里刪除。
此功能也沒有實現,并且這個問題是我耗時最多去思考的一個問題,用了幾種方法,都沒有達到預期的效果。
于是最后干脆在activity-B執行刪除動作結束后,跳轉到了主activity,也就是最初的界面。雖然麻煩了一步,不過總比我退回上一個界面后看到了我刪除的備忘錄信息還在強。。。
跳轉到主activity的實現很簡單,只需要在activity-A跳轉到activity-B時,finish掉A就可以了。
?
源碼:
一.com.example.DB 包:
1.DBHelper類:
創建數據庫
package com.example.DB;import android.content.Context; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper;public class DBHelper extends SQLiteOpenHelper{private static final int VERSION = 1;private static final String DBNAME = "memorandum.db";public DBHelper(Context context){super(context, DBNAME, null, VERSION);}public void onCreate(SQLiteDatabase db){// 創建數據庫db.execSQL("create table memorandum_db (_id integer primary key,flag varchar(400))");// 創建便簽信息表}@Overridepublic void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {// TODO Auto-generated method stub} }2.AddMemo類:
實現的主要功能:
添加便簽信息,更新便簽信息,查找便簽信息,刪除便簽信息,獲取便簽信息,獲取便簽的總記錄數,獲取便簽最大編號。
package com.example.DB;import java.util.ArrayList; import java.util.List;import com.example.model.Tb_flag;import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase;public class AddMemo {private DBHelper helper;private SQLiteDatabase db;public AddMemo(Context context){helper = new DBHelper(context);db = helper.getWritableDatabase();}/** 添加便簽信息* */public void add(Tb_flag tb_flag) {db.execSQL("insert into memorandum_db (_id,flag) values (?,?)", new Object[] {tb_flag.getid(), tb_flag.getFlag() });// 執行添加便簽信息操作}/** 更新便簽信息* */public void update(Tb_flag tb_flag) { // db = helper.getWritableDatabase();// 初始化SQLiteDatabase對象db.execSQL("update memorandum_db set flag = ? where _id = ?", new Object[] {tb_flag.getFlag(), tb_flag.getid() });// 執行修改便簽信息操作}/** 查找便簽信息* */public Tb_flag find(int id) { // db = helper.getWritableDatabase();// 初始化SQLiteDatabase對象Cursor cursor = db.rawQuery("select _id,flag from memorandum_db where _id = ?",new String[] { String.valueOf(id) });// 根據編號查找便簽信息,并存儲到Cursor類中if (cursor.moveToNext()){// 遍歷查找到的便簽信息// 將遍歷到的便簽信息存儲到Tb_flag類中return new Tb_flag(cursor.getInt(cursor.getColumnIndex("_id")),cursor.getString(cursor.getColumnIndex("flag")));}cursor.close();// 關閉游標return null;// 如果沒有信息,則返回null}/** 刪除便簽信息* */public void detele(Integer... ids) {if (ids.length > 0){// 判斷是否存在要刪除的idStringBuffer sb = new StringBuffer();// 創建StringBuffer對象for (int i = 0; i < ids.length; i++){// 遍歷要刪除的id集合sb.append('?').append(',');// 將刪除條件添加到StringBuffer對象中}sb.deleteCharAt(sb.length() - 1);// 去掉最后一個“,“字符 // db = helper.getWritableDatabase();// 創建SQLiteDatabase對象// 執行刪除便簽信息操作db.execSQL("delete from memorandum_db where _id in (" + sb + ")",(Object[]) ids);}}/*獲取便簽信息* */public List<Tb_flag> getScrollData(int start, int count) {List<Tb_flag> lisTb_flags = new ArrayList<Tb_flag>();// 創建集合對象 // db = helper.getWritableDatabase();// 初始化SQLiteDatabase對象// 獲取所有便簽信息Cursor cursor = db.rawQuery("select * from memorandum_db limit ?,?",new String[] { String.valueOf(start), String.valueOf(count) });while (cursor.moveToNext()){// 遍歷所有的便簽信息// 將遍歷到的便簽信息添加到集合中lisTb_flags.add(new Tb_flag(cursor.getInt(cursor.getColumnIndex("_id")), cursor.getString(cursor.getColumnIndex("flag"))));}cursor.close();// 關閉游標return lisTb_flags;// 返回集合}/** 獲取便簽的總記錄數* */public long getCount() { // db = helper.getWritableDatabase();// 初始化SQLiteDatabase對象Cursor cursor = db.rawQuery("select count(_id) from memorandum_db", null);// 獲取便簽信息的記錄數if (cursor.moveToNext()){// 判斷Cursor中是否有數據return cursor.getLong(0);// 返回總記錄數}cursor.close();// 關閉游標return 0;// 如果沒有數據,則返回0}/** 獲取便簽最大編號* */public int getMaxId() { // db = helper.getWritableDatabase();// 初始化SQLiteDatabase對象Cursor cursor = db.rawQuery("select max(_id) from memorandum_db", null);// 獲取便簽信息表中的最大編號while (cursor.moveToLast()) {// 訪問Cursor中的最后一條數據return cursor.getInt(0);// 獲取訪問到的數據,即最大編號}cursor.close();// 關閉游標return 0;// 如果沒有數據,則返回0} }?
二.com.example.model 包:
Tb_flag類:用于存儲便簽信息實體類
package com.example.model;public class Tb_flag { // 便簽信息實體類private int _id;// 存儲便簽編號private String flag;// 存儲便簽信息public Tb_flag(){// 默認構造函數super();}// 定義有參構造函數,用來初始化便簽信息實體類中的各個字段public Tb_flag(int id, String flag) {super();this._id = id;// 為便簽號賦值this.flag = flag;// 為便簽信息賦值}public int getid(){// 設置便簽編號的可讀屬性return _id;}public void setid(int id){// 設置便簽編號的可寫屬性this._id = id;}public String getFlag(){// 設置便簽信息的可讀屬性return flag;}public void setFlag(String flag){// 設置便簽信息的可寫屬性this.flag = flag;} }?
三.com.example.memorandum 包
1.MainActivity類:
package com.example.memorandum;import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button button1 = (Button)findViewById(R.id.button1);button1.setOnClickListener(new View.OnClickListener(){public void onClick(View v) {Intent intent = new Intent(MainActivity.this, EditMemo.class);startActivity(intent);}});Button button2 = (Button)findViewById(R.id.button2);button2.setOnClickListener(new View.OnClickListener(){public void onClick(View v) {Intent intent = new Intent(MainActivity.this, ShowInfo.class);startActivity(intent);}});}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {// Handle action bar item clicks here. The action bar will// automatically handle clicks on the Home/Up button, so long// as you specify a parent activity in AndroidManifest.xml.int id = item.getItemId();if (id == R.id.action_settings) {return true;}return super.onOptionsItemSelected(item);} }2.EditMemo:編輯便簽信息
package com.example.memorandum;import com.example.DB.AddMemo; import com.example.model.Tb_flag;import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast;public class EditMemo extends Activity {EditText txt;protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.editmemo);txt = (EditText)findViewById(R.id.txt);Button buttonSave = (Button)findViewById(R.id.save);buttonSave.setOnClickListener(new View.OnClickListener(){public void onClick(View v) {String str = txt.getText().toString();if(!str.isEmpty()) {AddMemo addmemo = new AddMemo(EditMemo.this);Tb_flag tb_flag = new Tb_flag(addmemo.getMaxId() + 1, str);addmemo.add(tb_flag);Toast.makeText(EditMemo.this, "便簽保存成功!",Toast.LENGTH_SHORT).show();finish();} else {Toast.makeText(EditMemo.this, "請輸入便簽!",Toast.LENGTH_SHORT).show();}}});Button buttonCancel = (Button)findViewById(R.id.cancel);buttonCancel.setOnClickListener(new View.OnClickListener(){public void onClick(View v) {txt.setText("");}});}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {// Handle action bar item clicks here. The action bar will// automatically handle clicks on the Home/Up button, so long// as you specify a parent activity in AndroidManifest.xml.int id = item.getItemId();if (id == R.id.action_settings) {return true;}return super.onOptionsItemSelected(item);} }3.ShowInfo類:顯示備忘錄信息列表的類
?
package com.example.memorandum;import java.util.List;import com.example.DB.AddMemo; import com.example.model.Tb_flag;import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.Window; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.TextView; import android.widget.AdapterView.OnItemClickListener;public class ShowInfo extends Activity {public static final String FLAG = "id";ListView lvinfo;String strType = "";protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);this.requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.showinfo);lvinfo = (ListView) findViewById(R.id.lvinfo);showinfo();lvinfo.setOnItemClickListener(new OnItemClickListener(){// 為ListView添加項單擊事件public void onItemClick(AdapterView<?> parent, View view,int position, long id) {String strInfo = String.valueOf(((TextView) view).getText());// 記錄單擊的項信息String strid = strInfo.substring(0, strInfo.indexOf('.'));// 從項信息中截取編號Intent intent = null;// 創建Intent對象intent = new Intent(ShowInfo.this, FlagManage.class);// 使用FlagManage窗口初始化Intent對象intent.putExtra(FLAG, strid);// 設置要傳遞的數據startActivity(intent);// 執行Intent,打開相應的Activityfinish();}});}private void showinfo() {String[] strInfos = null;ArrayAdapter<String> arrayAdapter = null;AddMemo info = new AddMemo(ShowInfo.this);// 創建AddMemo對象// 獲取所有便簽信息,并存儲到List泛型集合中List<Tb_flag> listFlags = info.getScrollData(0,(int) info.getCount());strInfos = new String[listFlags.size()];// 設置字符串數組的長度int n = 0;// 定義一個開始標識for (Tb_flag tb_flag : listFlags) {// 遍歷List泛型集合// 將便簽相關信息組合成一個字符串,存儲到字符串數組的相應位置strInfos[n] = tb_flag.getid() + "." + tb_flag.getFlag();if (strInfos[n].length() > 15)// 判斷便簽信息的長度是否大于15strInfos[n] = strInfos[n].substring(0, 15) + "……";// 將位置大于15之后的字符串用……代替n++;// 標識加1}// 使用字符串數組初始化ArrayAdapter對象arrayAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, strInfos);lvinfo.setAdapter(arrayAdapter);// 為ListView列表設置數據源}protected void onRestart() {super.onRestart();} }4.FlagManage類:
package com.example.memorandum;import com.example.memorandum.FlagManage; import com.example.memorandum.ShowInfo;import java.util.List;import com.example.DB.AddMemo; import com.example.model.Tb_flag;import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.Toast;public class FlagManage extends Activity {EditText txtFlag;// 創建EditText對象Button btnEdit, btnDel;// 創建兩個Button對象String strid;// 創建字符串,表示便簽的id@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.flagmanage);// 設置布局文件txtFlag = (EditText) findViewById(R.id.txtFlagManage);// 獲取便簽文本框btnEdit = (Button) findViewById(R.id.btnFlagManageEdit);// 獲取修改按鈕btnDel = (Button) findViewById(R.id.btnFlagManageDelete);// 獲取刪除按鈕Intent intent = getIntent();// 創建Intent對象Bundle bundle = intent.getExtras();// 獲取便簽idstrid = bundle.getString(ShowInfo.FLAG);// 將便簽id轉換為字符串final AddMemo info = new AddMemo(FlagManage.this);txtFlag.setText(info.find(Integer.parseInt(strid)).getFlag());// 根據便簽id查找便簽信息,并顯示在文本框中btnEdit.setOnClickListener(new OnClickListener() {// 為修改按鈕設置監聽事件@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubTb_flag tb_flag = new Tb_flag();// 創建Tb_flag對象tb_flag.setid(Integer.parseInt(strid));// 設置便簽idtb_flag.setFlag(txtFlag.getText().toString());// 設置便簽值info.update(tb_flag);// 修改便簽信息// 彈出信息提示Toast.makeText(FlagManage.this, "便簽修改成功!",Toast.LENGTH_SHORT).show();finish();}});btnDel.setOnClickListener(new OnClickListener() {// 為刪除按鈕設置監聽事件@Overridepublic void onClick(View arg0) {int id = Integer.parseInt(strid);info.detele(id);// 根據指定的id刪除便簽信息Toast.makeText(FlagManage.this, "便簽刪除成功!",Toast.LENGTH_SHORT).show();//下面代碼想在刪除一個便簽之后修改后面的便簽id號,但是失敗了,原因待查。/*List<Tb_flag> listFlags = info.getScrollData(0,(int) info.getCount());int i = 1, tag = 0;for (Tb_flag tb_flag : listFlags) {if (tb_flag.getid() != i) {tb_flag.setid(i);info.update(tb_flag);// 修改便簽信息}i++;}*/finish();}});}}Layout:
activity_main.xml
<RelativeLayout 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"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context="com.example.memorandum.MainActivity" ><Buttonandroid:id="@+id/button2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignBaseline="@+id/button1"android:layout_alignBottom="@+id/button1"android:layout_alignParentLeft="true"android:layout_marginLeft="25dp"android:text="查看備忘錄" /><ImageViewandroid:id="@+id/imageView1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_above="@+id/button1"android:layout_alignLeft="@+id/button2"android:layout_marginBottom="36dp"android:src="@drawable/image" /><Buttonandroid:id="@+id/button1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:layout_alignRight="@+id/imageView1"android:layout_marginBottom="39dp"android:text="添加備忘錄" /></RelativeLayout>editmemo.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/itemflag"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin" ><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:gravity="center_horizontal"android:text="新增便簽(400字以內)"android:textSize="25sp"android:textStyle="bold" /><EditTextandroid:id="@+id/txt"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="top"android:lines="10" /><RelativeLayoutandroid:layout_width="fill_parent"android:layout_height="fill_parent"android:padding="10dp" ><Buttonandroid:id="@+id/cancel"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:layout_marginLeft="10dp"android:text="清空" /><Buttonandroid:id="@+id/save"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_toLeftOf="@id/cancel"android:text="保存" /></RelativeLayout></LinearLayout>showinfo.xml
<?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" ><ListView android:id="@+id/lvinfo" android:layout_width="match_parent" android:layout_height="match_parent"android:scrollbarAlwaysDrawVerticalTrack="true"></ListView></LinearLayout>flagmanage.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/flagmanage"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><LinearLayout android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"android:layout_weight="3"><TextView android:layout_width="wrap_content"android:layout_gravity="center"android:gravity="center_horizontal"android:text="修改便簽(400字以內)"android:textSize="25sp"android:textStyle="bold" android:layout_height="wrap_content"/></LinearLayout><LinearLayout android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"android:layout_weight="1"><RelativeLayout android:layout_width="fill_parent"android:layout_height="fill_parent"android:padding="5dp"><EditText android:id="@+id/txtFlagManage"android:layout_width="350dp"android:layout_height="400dp"android:gravity="top"android:singleLine="false"/></RelativeLayout></LinearLayout><LinearLayout android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"android:layout_weight="3"><RelativeLayout android:layout_width="fill_parent"android:layout_height="fill_parent"android:padding="10dp"><Buttonandroid:id="@+id/btnFlagManageDelete"android:layout_width="80dp"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:layout_marginLeft="10dp"android:text="刪除"/><Button android:id="@+id/btnFlagManageEdit"android:layout_width="80dp"android:layout_height="wrap_content"android:layout_toLeftOf="@id/btnFlagManageDelete"android:text="修改" android:maxLength="200"/></RelativeLayout></LinearLayout> </LinearLayout>?
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.memorandum"android:versionCode="1"android:versionName="1.0" ><uses-sdkandroid:minSdkVersion="19"android:targetSdkVersion="19" /><applicationandroid:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><activityandroid:name=".MainActivity"android:label="@string/app_name" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><activityandroid:name=".EditMemo"android:label="編輯備忘錄" ></activity><activityandroid:name=".ShowInfo"android:label="備忘錄目錄" ></activity><activityandroid:name=".FlagManage"android:label="修改便簽"> </activity></application></manifest>?
就到這吧,基本功能就這些,因為還要準備考研,也沒什么時間去實現更好的功能了。
期末快樂!
總結
以上是生活随笔為你收集整理的Android开发:ListView+SQLite实现一个简单的备忘录程序(ADT插件环境)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于Qt+海康sdk+MySql的远程录
- 下一篇: 51单片机特殊功能寄存器sfr和sbit