Android數據庫操作_表格顯示
顯示表格布局
完成后效果如下:
首先需要一個主布局文件main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal" > <View android:layout_width="0.5px" android:layout_height="fill_parent" android:background="#B8B8B8" android:visibility="visible" /> <TextView android:id="@+id/id" android:layout_width="0dip" android:layout_height="35dip" android:layout_weight="2" android:textColor="#CD3700" android:textSize="20sp" /> <View android:layout_width="0.5px" android:layout_height="fill_parent" android:background="#B8B8B8" android:visibility="visible" /> <TextView android:id="@+id/name" android:layout_width="0dip" android:layout_height="wrap_content" android:layout_weight="3" android:textColor="#000000" android:textSize="17sp" /> <View android:layout_width="0.5px" android:layout_height="fill_parent" android:background="#B8B8B8" android:visibility="visible" /> <TextView android:id="@+id/age" android:layout_width="0dip" android:layout_height="wrap_content" android:layout_weight="1" android:textColor="#000000" android:textSize="17sp" /> <View android:layout_width="0.5px" android:layout_height="fill_parent" android:background="#B8B8B8" android:visibility="visible" /> </LinearLayout>
View起到的作用是在兩列之間起到分割的作用,縱觀這個布局文件,就是完成這樣的工作,設置一個表頭,將三個TextView放置在一個水平的線性布局中去,分別顯示一列的表頭,然后需要一個ListView與上述的線性布局一同放入一個垂直的線性布局中去,用來顯示每一條記錄。而每一條記錄的顯示需要我們來實現一個adapter去完成每一項的顯示,下面就完成這個項的布局文件:itemlayout.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal" > <View android:layout_width="0.5px" android:layout_height="fill_parent" android:background="#B8B8B8" android:visibility="visible" /> <TextView android:id="@+id/id" android:layout_width="0dip" android:layout_height="35dip" android:layout_weight="2" android:textColor="#CD3700" android:textSize="20sp" /> <View android:layout_width="0.5px" android:layout_height="fill_parent" android:background="#B8B8B8" android:visibility="visible" /> <TextView android:id="@+id/name" android:layout_width="0dip" android:layout_height="wrap_content" android:layout_weight="3" android:textColor="#000000" android:textSize="17sp" /> <View android:layout_width="0.5px" android:layout_height="fill_parent" android:background="#B8B8B8" android:visibility="visible" /> <TextView android:id="@+id/age" android:layout_width="0dip" android:layout_height="wrap_content" android:layout_weight="1" android:textColor="#000000" android:textSize="17sp" /> <View android:layout_width="0.5px" android:layout_height="fill_parent" android:background="#B8B8B8" android:visibility="visible" /> </LinearLayout>
在listview中每一項的布局應該是這樣的,需要View來分割每一列,然后需要TextView來顯示數據的信息,這些組件之間放在一個水平的線性布局中去。
這樣我們就完成了程序的主體布局。接下來我們需要一個適配器(adapter)來完成對listview中每一項的數據填入。SimpleCursorAdapter是一個簡單 的適配器,可以將cursor中的每一行的記錄映射到一個顯示的組件上一般是TextView或者是ImageView。那我們就繼承這個類來完成自己的adapter。
下面是我們的adapter它繼承了SimpleCursorAdapter。
package com.example.gird; import android.content.Context; import android.database.Cursor; import android.graphics.Color; import android.view.View; import android.view.ViewGroup; import android.widget.SimpleCursorAdapter; public class MySimpleCursorAdapter extends SimpleCursorAdapter { public MySimpleCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to) { super(context, layout, c, from, to); } @Override public View getView(int position, View convertView, ViewGroup parent) { View view = null; if (convertView != null) { view = convertView; } else { view = super.getView(position, convertView, parent); } /*author:conowen * date:2012.4.2 * MySimpleCursorAdapter */ int[] colors = { Color.WHITE, Color.rgb(219, 238, 244) };// RGB顏色 view.setBackgroundColor(colors[position % 2]);// 每隔item之間顏色不同 return super.getView(position, view, parent); } }
在其中完成的主要是對getView方法的重寫。position當前由不可見到可見的項的位置,convertView就是要顯示的組件項,這個時候Android不會每次都去實例化一個新的view對象,而是去看在緩存中是否存在一個這樣的對象,若有就直接拿來,若沒有才會去實例化新的對象。而parent是告訴這些個項最終會依附在哪一個父親組件上去(Listview)。
package com.example.gird; import android.app.Activity; import android.app.AlertDialog; import android.content.ContentValues; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.database.Cursor; import android.database.sqlite.SQLiteCursor; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemLongClickListener; import android.widget.EditText; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.TextView; public class GridActivity extends Activity { public int DB_VERSION = 1; SQLiteDatabase db; // DbHelper類在DbHelper.java文件里面創建的 ListView lv; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // 建立打開數據庫 db = openOrCreateDatabase("test.db", Context.MODE_PRIVATE, null); db.execSQL("DROP TABLE IF EXISTS person"); // 創建person表 db.execSQL("CREATE TABLE person (_id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR, age SMALLINT)"); // 插入數據 for (int i = 0; i < 20; i++) { Person person = new Person(); person.name = "john" + i; person.age = 30 - i; db.execSQL("INSERT INTO person VALUES (NULL, ?, ?)", new Object[] { person.name, person.age }); } lv = (ListView) findViewById(R.id.lv); updatelistview(); // 添加一個長按事件 lv.setOnItemLongClickListener(new OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> parent, View view, final int position, long id) { // 實例化一個彈出框 new AlertDialog.Builder(GridActivity.this) .setTitle("選擇操作") .setItems(new String[] { "更新", "刪除", "取消" }, // 為彈出框上的選項添加事件 new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { switch (which) { // 表示更新內容 case 0: LayoutInflater inflater = getLayoutInflater(); // 自定義一個彈出口布局 final View layout = inflater .inflate( R.layout.dialog, (ViewGroup) findViewById(R.id.dialog)); EditText nameTxt = (EditText) layout .findViewById(R.id.editText1); TextView ageTxt = (EditText) layout .findViewById(R.id.editText2); SQLiteCursor s_old = (SQLiteCursor) lv .getItemAtPosition(position); final int _id_old = s_old.getInt(s_old .getColumnIndex("_id")); final String name_old = s_old.getString(s_old .getColumnIndex("name")); final String age_old = s_old.getString(s_old .getColumnIndex("age")); nameTxt.setText(name_old); ageTxt.setText(age_old); new AlertDialog.Builder( GridActivity.this) .setTitle("更新") .setView(layout) .setPositiveButton( "確定", new OnClickListener() { @Override public void onClick( DialogInterface dialog, int which) { ContentValues cv = new ContentValues(); String temp_name = ((EditText) layout .findViewById(R.id.editText1)) .getText() .toString(); String temp_age = ((EditText) layout .findViewById(R.id.editText2)) .getText() .toString(); cv.put("_id", _id_old); cv.put("name", temp_name); cv.put("age", temp_age); String[] id_index = { String .valueOf(_id_old) }; db.update( "person", cv, "_id=?", id_index); updatelistview(); } }) .setNegativeButton("取消", null).show(); break; // 刪除記錄 case 1: // getItemAtPosition()得到一個item里的數據 SQLiteCursor s = (SQLiteCursor) lv .getItemAtPosition(position); final int _id = s.getInt(s .getColumnIndex("_id")); String name = s.getString(s .getColumnIndex("name")); Log.i("id ::", _id + ""); new AlertDialog.Builder( GridActivity.this) .setTitle( "確定刪除" + name + "嗎?") .setPositiveButton( "確定", new OnClickListener() { @Override public void onClick( DialogInterface dialog, int which) { db.execSQL( "delete from person where _id =?", new Integer[] { _id }); updatelistview(); } }) .setNegativeButton( "取消", new OnClickListener() { @Override public void onClick( DialogInterface dialog, int which) { } }).show(); break; // 取消操作 case 2: break; } } }).show(); return false; } }); } // 更新listview public void updatelistview() { Cursor cr = db.query("person", null, null, null, null, null, null); String id = cr.getColumnName(0); String name = cr.getColumnName(1); String age = cr.getColumnName(2); String[] ColumnNames = { id, name, age }; ListAdapter adapter = new MySimpleCursorAdapter(this, R.layout.listviewlayout, cr, ColumnNames, new int[] { R.id.id, R.id.name, R.id.age }); lv.setAdapter(adapter); } @Override protected void onPause() { onDestroy(); Log.i("message", "數據庫連接銷毀"); super.onPause(); } @Override protected void onDestroy() {// 關閉數據庫 super.onDestroy(); if (db != null) { db.close(); } } }
最后的效果圖
對話框的布局文件代碼
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal" android:id="@+id/dialog" > <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:text="新姓名" /> <EditText android:id="@+id/editText1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:layout_marginRight="16dp" android:ems="10" /> <EditText android:id="@+id/editText2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBottom="@+id/textView2" android:layout_alignLeft="@+id/editText1" android:ems="10" /> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_below="@+id/editText1" android:layout_marginTop="39dp" android:text="新年齡" /> </RelativeLayout> </LinearLayout>