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>
<?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>