ListView與Sqlite數據庫綁定步驟:
1.將Sqlite數據庫的內容查詢出來並放入數組列表中,形成ListView的數據源;
2.適配器綁定數據源,顯示在ListView item中。
本文實現的ListView與Sqlite數據綁定的功能如下圖-1
圖-1 ListView與Sqlite數據綁定的功能界面
本例主要實現的是一個學生數據表(Sqlite數據庫)與ListView控件綁定數據的功能。
數據庫爲user.db,學生表爲student,學生表包含的字段有:id,username,birthday,image。
image放在android的資源文件內。初始化時,自動創建數據庫,用戶表並插入三條用戶數據,以作爲Listview的數據源。
通過SimpleAdapter適配器與ListView控件綁定。
關於ListView與SimpleAdapter數據綁定,以及Sqlite數據庫的創建,表的創建,表的操作,在本博客中有所敘述,這裏不再敘述。可以說本文是將ListView使用與Sqlite使用相結合的結果,只是有更多的細節需要注意。
除了綁定數據庫,還增加一個ListView長按Item選項的事件操作,本例長按ListView數據選項後會彈出一個詢問的對話框,詢問是否刪除當前選項的數據表的一條數據。實現Listview長按響應事件,需要實現OnCreateContextMenuListener類的方法。通過AdapterView.AdapterContextMenuInfo類獲取選項的相應位置,也就是數據源的具體數據,獲取選項位置後,可以提取相應選項的內容進而執行相關的操作。
圖片添加如下圖
1.類文件
ListView_SqliteActivity.java
package codyy.liuyong;
import java.util.ArrayList;
import java.util.HashMap;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.ContentValues;
import android.content.DialogInterface;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.View;
import android.view.View.OnCreateContextMenuListener;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
public class ListView_SqliteActivity extends Activity {
SQLiteDatabase mDb;
SQLiteDatabaseDao dao;
// 存儲數據的數組列表
ArrayList<HashMap<String, Object>> listData;
// 適配器
SimpleAdapter listItemAdapter;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
dao = new SQLiteDatabaseDao();
ListView list = (ListView) findViewById(R.id.list_items);
listItemAdapter = new SimpleAdapter(ListView_SqliteActivity.this,
listData,// 數據源
R.layout.item,// ListItem的XML實現
// 動態數組與ImageItem對應的子項
new String[] { "image", "username", "birthday" },
// ImageItem的XML文件裏面的一個ImageView,兩個TextView ID
new int[] { R.id.image, R.id.username, R.id.birthday });
list.setAdapter(listItemAdapter);
list.setOnCreateContextMenuListener(listviewLongPress);
}
// 簡單的數據庫操作類
class SQLiteDatabaseDao {
public SQLiteDatabaseDao() {
mDb = openOrCreateDatabase("users.db",
SQLiteDatabase.CREATE_IF_NECESSARY, null);
// 初始化創建表
createTable(mDb, "student");
// 初始化插入數據
insert(mDb, "student");
// 初始化獲取所有數據表數據
getAllData("student");
}
// 創建一個數據庫
public void createTable(SQLiteDatabase mDb, String table) {
try {
mDb.execSQL("create table if not exists "
+ table
+ " (id integer primary key autoincrement, "
+ "username text not null, birthday text not null,image text);");
} catch (SQLException e) {
Toast.makeText(getApplicationContext(), "數據表創建失敗",
Toast.LENGTH_LONG).show();
}
}
// 插入數據
public void insert(SQLiteDatabase mDb, String table) {
// 初始化插入3條數據
ContentValues values = new ContentValues();
values.put("username", "LiMei");
values.put("birthday", "Birthday:6-18");
values.put("image", R.drawable.o);
mDb.insert(table, null, values);
values.put("username", "LinQiao");
values.put("birthday", "Birthday:8-22");
values.put("image", R.drawable.t);
mDb.insert(table, null, values);
values.put("username", "WiLee");
values.put("birthday", "Birthday:9-12");
values.put("image", R.drawable.f);
mDb.insert(table, null, values);
}
// 查詢所有數據
public void getAllData(String table) {
Cursor c = mDb.rawQuery("select * from " + table, null);
int columnsSize = c.getColumnCount();
listData = new ArrayList<HashMap<String, Object>>();
// 獲取表的內容
while (c.moveToNext()) {
HashMap<String, Object> map = new HashMap<String, Object>();
for (int i = 0; i < columnsSize; i++) {
map.put("id", c.getString(0));
map.put("username", c.getString(1));
map.put("birthday", c.getString(2));
map.put("image", c.getString(3));
}
listData.add(map);
}
}
// 刪除一條數據
public boolean delete(SQLiteDatabase mDb, String table, int id) {
String whereClause = "id=?";
String[] whereArgs = new String[] { String.valueOf(id) };
try {
mDb.delete(table, whereClause, whereArgs);
} catch (SQLException e) {
Toast.makeText(getApplicationContext(), "刪除數據庫失敗",
Toast.LENGTH_LONG).show();
return false;
}
return true;
}
}
// 長按事件響應
OnCreateContextMenuListener listviewLongPress = new OnCreateContextMenuListener() {
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
// TODO Auto-generated method stub
final AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
new AlertDialog.Builder(ListView_SqliteActivity.this)
/* 彈出窗口的最上頭文字 */
.setTitle("刪除當前數據")
/* 設置彈出窗口的圖式 */
.setIcon(android.R.drawable.ic_dialog_info)
/* 設置彈出窗口的信息 */
.setMessage("確定刪除當前記錄")
.setPositiveButton("是",
new DialogInterface.OnClickListener() {
public void onClick(
DialogInterface dialoginterface, int i) {
// 獲取位置索引
int mListPos = info.position;
// 獲取對應HashMap數據內容
HashMap<String, Object> map = listData
.get(mListPos);
// 獲取id
int id = Integer.valueOf((map.get("id")
.toString()));
// 獲取數組具體值後,可以對數據進行相關的操作,例如更新數據
if (dao.delete(mDb, "student", id)) {
// 移除listData的數據
listData.remove(mListPos);
listItemAdapter.notifyDataSetChanged();
}
}
})
.setNegativeButton("否",
new DialogInterface.OnClickListener() {
public void onClick(
DialogInterface dialoginterface, int i) {
// 什麼也沒做
}
}).show();
}
};
@Override
public void finish() {
// TODO Auto-generated method stub
super.finish();
mDb.close();
}
}
2.xml文件
main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<ListView
android:id="@+id/list_items"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:divider="#ffffff"
android:dividerHeight="1dip" />
</RelativeLayout>
item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/RelativeLayout"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingBottom="4dip"
android:paddingLeft="12dip"
android:paddingRight="12dip" >
<ImageView
android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:paddingLeft="6dip"
android:paddingTop="6dip" />
<TextView
android:id="@+id/username"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingTop="6dip"
android:textColor="#ccc"
android:textSize="18dip" />
<TextView
android:id="@+id/birthday"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/username"
android:maxLines="2"
android:paddingRight="20dip"
android:textColor="#fff" />
</RelativeLayout>