android例項 listview與sqlite資料繫結
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>