首页 > 代码库 > Android数据库操作_表格显示

Android数据库操作_表格显示

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>