1. 程式人生 > >android例項 listview與sqlite資料繫結

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>