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>
android实例 listview与sqlite数据绑定的更多相关文章
- 42.Android之ListView中ArrayAdapter简单学习
今天学习下Android中ListView关于ArrayAdapter数据绑定, 废话少说直接上代码. 改下布局文件: <?xml version="1.0" encodin ...
- [android] 手机卫士黑名单功能(ListView结合SQLite增删改)
修改界面,在顶部横条上增加一个添加按钮,点击打开一个自定义对话框,输入电话号码和拦截模式保存到数据库 自定义对话框看这篇http://www.cnblogs.com/taoshihan/p/53703 ...
- Android之ListView性能优化——一行代码绑定数据——万能适配器
如下图,加入现在有一个这样的需求图,你会怎么做?作为一个初学者,之前我都是直接用SimpleAdapter结合一个Item的布局来实现的,感觉这样实现起来很方便(基本上一行代码就可以实现),而且也没有 ...
- android——自定义listView
都知道微信主机面 有个界面会一行一一行的聊天记录,那个效果就可以用listview来实现(当然这只是其中的一种) listView是一种比较常见的组件它用来展示列的view,它是根据数据的长度来显示数 ...
- 45个android实例源码
分享45个android实例源码,很好很强大http://www.apkbus.com/android-20978-1-1.html andriod闹钟源代码http://www.apkbus.com ...
- 分享45个android实例源码,很好很强大
分享45个android实例源码,很好很强大 http://www.apkbus.com/android-20978-1-1.html 分享45个android实例源码,很好很强大http://www ...
- android学习笔记48——SQLite
SQLite SQLite试试一个嵌入式的数据库引擎,专门用于资源有限的设备(如手机.PDA)上适量数据存取. SQLite支持绝大部分SQL92语法,同样允许开发者使用SQL语句操作数据库中的数据, ...
- Android的ListView
ListView ListView 是一个控件,一个在垂直滚动的列表中显示条目的一个控件,这些条目的内容来自于一个ListAdapter. 一个简单的例子 布局文件里新增ListView <Li ...
- 【Android 应用开发】Android 数据存储 之 SQLite数据库详解
. 作者 :万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/19028665 . SQLiteDataBase示例程序下 ...
随机推荐
- js中getBoundingClientrRect()方法的详解
getBoundingClientRect(): 这个方法返回一个矩形对象,包含四个属性:left.top.right和buttom.分别表示元素各边与页面各边的距离 例如: var boxPosit ...
- JetBrains Pycharm破解,含破解文件和安装包2019.2版
此教程支持最新的2019.3版本的Pycharm,并兼容之前的版本. 一.准备工作: 1.下载Pycharm 有条件的可以自行去官网下载,这里我提供了我下载的版本,已上传到百度网盘,链接在下方. 2. ...
- Java之IO流用法总结
Java的IO流概述:1.I/O是Input/Output的缩写,I/O技术是非常实用的技术,用于处理设备之间的数据传输.如读/写文件,网络通讯等.2.Java程序中,对于数据的输入/输出操作以“流( ...
- 5、调试显示应该使用 DebuggerDisplay 而不是误用 ToString
using System.Diagnostics; namespace ShouldCode.Console { [DebuggerDisplay("Prop1:{Prop1};Prop2: ...
- Spring学习记录3——Spring AOP
SpringAOP基础 AOP简介: AOP是Aspect Oriented Programing的简称,翻译为“面向切面编程”.它适用于具有横切逻辑的应用场合,如性能检测,访问控制,事务管理及日志记 ...
- LCA - 求任意两点间的距离
There are n houses in the village and some bidirectional roads connecting them. Every day peole alwa ...
- 字典树 (HDU 2072)
lily的好朋友xiaoou333最近很空,他想了一件没有什么意义的事情,就是统计一篇文章里不同单词的总数.下面你的任务是帮助xiaoou333解决这个问题. Input有多组数据,每组一行,每组就是 ...
- Maven 基础环境搭建 项目依赖jar包导入
一.创建一个Maven工程 不清楚的话请查阅其它文档. 二.引入项目依赖的jar包 1.Spring 2.SpringMvc 3.Mybatis 4. 数据库连接池,驱动 5.其它(jstl.serv ...
- 每天玩转3分钟 MyBatis-Plus - 1. 配置环境
每天玩转3分钟 MyBatis-Plus - 1. 配置环境 每天玩转3分钟 MyBatis-Plus - 2. 普通查询 MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 ...
- MyBatis.多条件排序
<if test="orderBy != null"> order by <choose> <when test='orderBy=="ag ...