android 記事本demo!!!(listview與SQLite綜合)
阿新 • • 發佈:2019-02-14
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>