listview與SQLite結(jié)合實現(xiàn)記事本功能
android記事本的demo在網(wǎng)上一搜一大堆,但是大神寫的demo往往功能太多導(dǎo)致新手難以著手,很難啃得動;而一些新手寫的demo又往往是東拼西湊,代碼很多都是copy的別人的,直接放在項目里面用,也不知道代碼有什么作用。往往代碼特別丑,重復(fù)性的代碼也比較多。
筆者近期學(xué)到此處,自己理解之后也還是打算寫個demo供新手學(xué)習(xí)一下。代碼說不上優(yōu)雅,但在筆者看來已經(jīng)盡力去讓人容易理解了。(源碼在文章結(jié)尾)
為了便于新手學(xué)習(xí),在此也是羅列一下涉及的知識點:
1、SQLite的基本使用,增刪查改
2、listview,adapeter的基本使用
3、activity生命周期
4、intent、bundle傳遞參數(shù)
5、AlertDialog的基本使用
另外還有一些零碎知識點都可以百度到。
遇到的問題:
SQlite有個問題,就是主鍵不能夠自動排序。比如說主鍵id為1 2 3 4,共4條記錄?,F(xiàn)在刪除2 3,還剩下1 4記錄,當(dāng)再次插入時,id會變成5,而不是2.假設(shè)在初始4條記錄的基礎(chǔ)上,把這4條記錄全都刪掉,再次插入時,得到的id是5.
筆者在這點上也是花了比較久的時間,原本為了精簡代碼,想法是用listview中的arg2直接通過數(shù)據(jù)庫記錄的id進行操作,但是由于SQLite的這個問題,所以這種方法就有問題了。
最終,筆者采用的是內(nèi)容搜索的方法,從listview的每個item中獲取內(nèi)容,然后到數(shù)據(jù)庫中通過內(nèi)容搜索該記錄,最后對其進行操作。
效果:
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已經(jīng)有的內(nèi)容,全部刪掉 //并且更新simp_adapter int size = dataList.size(); if (size > 0) { dataList.removeAll(dataList); simple_adapter.notifyDataSetChanged(); } //從數(shù)據(jù)庫讀取信息 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中某一項的點擊監(jiān)聽事件 @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { //獲取listview中此個item中的內(nèi)容 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("確認(rèn)刪除嗎?"); builder.setPositiveButton("確定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //獲取listview中此個item中的內(nèi)容 //刪除該行后刷新listview的內(nèi)容 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;//用來區(qū)分是新建一個note還是更改原來的note public String last_content;//用來獲取edittext內(nèi)容 @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); //接收內(nèi)容和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內(nèi)容 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); //向數(shù)據(jù)庫添加信息 ContentValues values = new ContentValues(); values.put("content", content); values.put("date", dateString); db.insert("note", null, values); finish(); } else { Toast.makeText(noteEdit.this, "請輸入你的內(nèi)容!", 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="內(nèi)容編輯:" 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>
最后附上源碼:記事本
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Flutter如何通過一行命令解決多個pubspec.yaml文件的依賴項問題
這篇文章主要介紹了Flutter如何通過一行命令解決多個pubspec.yaml文件的依賴項問題,本文結(jié)合實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-06-06Android開發(fā)中Listview動態(tài)加載數(shù)據(jù)的方法示例
這篇文章主要介紹了Android開發(fā)中Listview動態(tài)加載數(shù)據(jù)的方法,結(jié)合實例形式較為詳細(xì)的分析了Android操作ListView界面布局與數(shù)據(jù)動態(tài)更新相關(guān)操作技巧,需要的朋友可以參考下2017-10-10Android使用Item Swipemenulistview實現(xiàn)仿QQ側(cè)滑刪除功能
大家都用過QQ,肯定有人好奇QQ滑動刪除Item的效果是怎樣實現(xiàn)的,其實我們使用Swipemenulistview就可以簡單的實現(xiàn)。這篇文章主要介紹了Android使用ItemSwipemenulistview實現(xiàn)仿QQ側(cè)滑刪除功能,需要的朋友可以參考下2017-02-02Kotlin開發(fā)中open關(guān)鍵字與類名函數(shù)名和變量名的使用方法淺析
這篇文檔中,我們將解釋如何以及為什么將 open 關(guān)鍵字與類名、函數(shù)名和變量名一起使用,了解內(nèi)部原理是為了幫助我們做擴展,同時也是驗證了一個人的學(xué)習(xí)能力,如果你想讓自己的職業(yè)道路更上一層樓,這些底層的東西你是必須要會的2023-02-02Android入門之LinearLayout、AbsoluteLayout的用法實例講解
這篇文章主要介紹了Android入門之LinearLayout、AbsoluteLayout的用法,對于Android初學(xué)者有很好的參考借鑒價值,需要的朋友可以參考下2014-08-08