zoukankan      html  css  js  c++  java
  • listview与sqlite数据绑定

    转自CSDN  richnaly 仅供自己学习记录

    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

    [java] view plaincopy
     
    1. package codyy.liuyong;  
    [java] view plaincopy
     
    1. import java.util.ArrayList;  
    2. import java.util.HashMap;  
    3.   
    4. import android.app.Activity;  
    5. import android.app.AlertDialog;  
    6. import android.content.ContentValues;  
    7. import android.content.DialogInterface;  
    8. import android.database.Cursor;  
    9. import android.database.SQLException;  
    10. import android.database.sqlite.SQLiteDatabase;  
    11. import android.os.Bundle;  
    12. import android.view.ContextMenu;  
    13. import android.view.ContextMenu.ContextMenuInfo;  
    14. import android.view.View;  
    15. import android.view.View.OnCreateContextMenuListener;  
    16. import android.widget.AdapterView;  
    17. import android.widget.ListView;  
    18. import android.widget.SimpleAdapter;  
    19. import android.widget.Toast;  
    20.   
    21. public class ListView_SqliteActivity extends Activity {  
    22.   
    23.     SQLiteDatabase mDb;  
    24.     SQLiteDatabaseDao dao;  
    25.     // 存储数据的数组列表  
    26.     ArrayList<HashMap<String, Object>> listData;  
    27.     // 适配器  
    28.     SimpleAdapter listItemAdapter;  
    29.   
    30.     /** Called when the activity is first created. */  
    31.     @Override  
    32.     public void onCreate(Bundle savedInstanceState) {  
    33.         super.onCreate(savedInstanceState);  
    34.         setContentView(R.layout.main);  
    35.         dao = new SQLiteDatabaseDao();  
    36.   
    37.         ListView list = (ListView) findViewById(R.id.list_items);  
    38.         listItemAdapter = new SimpleAdapter(ListView_SqliteActivity.this,  
    39.                 listData,// 数据源  
    40.                 R.layout.item,// ListItem的XML实现  
    41.                 // 动态数组与ImageItem对应的子项  
    42.                 new String[] { "image", "username", "birthday" },  
    43.                 // ImageItem的XML文件里面的一个ImageView,两个TextView ID  
    44.                 new int[] { R.id.image, R.id.username, R.id.birthday });  
    45.         list.setAdapter(listItemAdapter);  
    46.         list.setOnCreateContextMenuListener(listviewLongPress);  
    47.     }  
    48.   
    49.     // 简单的数据库操作类  
    50.   
    51.     class SQLiteDatabaseDao {  
    52.   
    53.         public SQLiteDatabaseDao() {  
    54.             mDb = openOrCreateDatabase("users.db",  
    55.                     SQLiteDatabase.CREATE_IF_NECESSARY, null);  
    56.             // 初始化创建表  
    57.             createTable(mDb, "student");  
    58.             // 初始化插入数据  
    59.             insert(mDb, "student");  
    60.             // 初始化获取所有数据表数据  
    61.             getAllData("student");  
    62.         }  
    63.   
    64.         // 创建一个数据库  
    65.         public void createTable(SQLiteDatabase mDb, String table) {  
    66.             try {  
    67.                 mDb.execSQL("create table if not exists "  
    68.                         + table  
    69.                         + " (id integer primary key autoincrement, "  
    70.                         + "username text not null, birthday text not null,image text);");  
    71.             } catch (SQLException e) {  
    72.                 Toast.makeText(getApplicationContext(), "数据表创建失败",  
    73.                         Toast.LENGTH_LONG).show();  
    74.             }  
    75.         }  
    76.   
    77.         // 插入数据  
    78.         public void insert(SQLiteDatabase mDb, String table) {  
    79.   
    80.             // 初始化插入3条数据  
    81.             ContentValues values = new ContentValues();  
    82.             values.put("username", "LiMei");  
    83.             values.put("birthday", "Birthday:6-18");  
    84.             values.put("image", R.drawable.o);  
    85.             mDb.insert(table, null, values);  
    86.   
    87.             values.put("username", "LinQiao");  
    88.             values.put("birthday", "Birthday:8-22");  
    89.             values.put("image", R.drawable.t);  
    90.             mDb.insert(table, null, values);  
    91.   
    92.             values.put("username", "WiLee");  
    93.             values.put("birthday", "Birthday:9-12");  
    94.             values.put("image", R.drawable.f);  
    95.             mDb.insert(table, null, values);  
    96.   
    97.         }  
    98.   
    99.         // 查询所有数据  
    100.         public void getAllData(String table) {  
    101.             Cursor c = mDb.rawQuery("select * from " + table, null);  
    102.             int columnsSize = c.getColumnCount();  
    103.             listData = new ArrayList<HashMap<String, Object>>();  
    104.             // 获取表的内容  
    105.             while (c.moveToNext()) {  
    106.                 HashMap<String, Object> map = new HashMap<String, Object>();  
    107.                 for (int i = 0; i < columnsSize; i++) {  
    108.                     map.put("id", c.getString(0));  
    109.                     map.put("username", c.getString(1));  
    110.                     map.put("birthday", c.getString(2));  
    111.                     map.put("image", c.getString(3));  
    112.                 }  
    113.                 listData.add(map);  
    114.             }  
    115.         }  
    116.   
    117.         // 删除一条数据  
    118.         public boolean delete(SQLiteDatabase mDb, String table, int id) {  
    119.             String whereClause = "id=?";  
    120.             String[] whereArgs = new String[] { String.valueOf(id) };  
    121.             try {  
    122.                 mDb.delete(table, whereClause, whereArgs);  
    123.             } catch (SQLException e) {  
    124.                 Toast.makeText(getApplicationContext(), "删除数据库失败",  
    125.                         Toast.LENGTH_LONG).show();  
    126.                 return false;  
    127.             }  
    128.             return true;  
    129.         }  
    130.     }  
    131.   
    132.     // 长按事件响应  
    133.     OnCreateContextMenuListener listviewLongPress = new OnCreateContextMenuListener() {  
    134.         @Override  
    135.         public void onCreateContextMenu(ContextMenu menu, View v,  
    136.                 ContextMenuInfo menuInfo) {  
    137.             // TODO Auto-generated method stub  
    138.             final AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;  
    139.             new AlertDialog.Builder(ListView_SqliteActivity.this)  
    140.                     /* 弹出窗口的最上头文字 */  
    141.                     .setTitle("删除当前数据")  
    142.                     /* 设置弹出窗口的图式 */  
    143.                     .setIcon(android.R.drawable.ic_dialog_info)  
    144.                     /* 设置弹出窗口的信息 */  
    145.                     .setMessage("确定删除当前记录")  
    146.                     .setPositiveButton("是",  
    147.                             new DialogInterface.OnClickListener() {  
    148.                                 public void onClick(  
    149.                                         DialogInterface dialoginterface, int i) {  
    150.                                     // 获取位置索引  
    151.                                     int mListPos = info.position;  
    152.                                     // 获取对应HashMap数据内容  
    153.                                     HashMap<String, Object> map = listData  
    154.                                             .get(mListPos);  
    155.                                     // 获取id  
    156.                                     int id = Integer.valueOf((map.get("id")  
    157.                                             .toString()));  
    158.                                     // 获取数组具体值后,可以对数据进行相关的操作,例如更新数据  
    159.                                     if (dao.delete(mDb, "student", id)) {  
    160.                                         // 移除listData的数据  
    161.                                         listData.remove(mListPos);  
    162.                                         listItemAdapter.notifyDataSetChanged();  
    163.                                     }  
    164.                                 }  
    165.                             })  
    166.                     .setNegativeButton("否",  
    167.                             new DialogInterface.OnClickListener() {  
    168.                                 public void onClick(  
    169.                                         DialogInterface dialoginterface, int i) {  
    170.                                     // 什么也没做  
    171.   
    172.                                 }  
    173.                             }).show();  
    174.         }  
    175.     };  
    176.   
    177.     @Override  
    178.     public void finish() {  
    179.         // TODO Auto-generated method stub  
    180.         super.finish();  
    181.         mDb.close();  
    182.     }  
    183. }  

    2.xml文件

    main.xml

    [html] view plaincopy
     
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    3.     android:layout_width="fill_parent"  
    4.     android:layout_height="fill_parent"  
    5.     android:orientation="vertical" >  
    6.   
    7.     <ListView  
    8.         android:id="@+id/list_items"  
    9.         android:layout_width="wrap_content"  
    10.         android:layout_height="wrap_content"  
    11.         android:divider="#ffffff"  
    12.         android:dividerHeight="1dip" />  
    13.   
    14. </RelativeLayout>  


    item.xml

    [html] view plaincopy
     
      1. <?xml version="1.0" encoding="utf-8"?>  
      2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
      3.     android:id="@+id/RelativeLayout"  
      4.     android:layout_width="fill_parent"  
      5.     android:layout_height="wrap_content"  
      6.     android:paddingBottom="4dip"  
      7.     android:paddingLeft="12dip"  
      8.     android:paddingRight="12dip" >  
      9.   
      10.     <ImageView  
      11.         android:id="@+id/image"  
      12.         android:layout_width="wrap_content"  
      13.         android:layout_height="wrap_content"  
      14.         android:layout_alignParentRight="true"  
      15.         android:paddingLeft="6dip"  
      16.         android:paddingTop="6dip" />  
      17.   
      18.     <TextView  
      19.         android:id="@+id/username"  
      20.         android:layout_width="fill_parent"  
      21.         android:layout_height="wrap_content"  
      22.         android:paddingTop="6dip"  
      23.         android:textColor="#ccc"  
      24.         android:textSize="18dip" />  
      25.   
      26.     <TextView  
      27.         android:id="@+id/birthday"  
      28.         android:layout_width="fill_parent"  
      29.         android:layout_height="wrap_content"  
      30.         android:layout_below="@+id/username"  
      31.         android:maxLines="2"  
      32.         android:paddingRight="20dip"  
      33.         android:textColor="#fff" />  
      34.   
      35. </RelativeLayout>  
  • 相关阅读:
    BZOJ 1823: [JSOI2010]满汉全席 [2-SAT]
    POJ 3683 Priest John's Busiest Day[2-SAT 构造解]
    Centos出现-bash: unzip: command not found的解决办法
    物理cpu与逻辑cpu概述
    如何正确查看Linux机器内存使用情况
    connections java.net.BindException: Address already in use_解决方案
    Linux查看端口、进程情况及kill进程
    linux如何查看端口被哪个进程占用?
    如何正确查看Linux机器内存使用情况
    TPS和事务响应时间的关系
  • 原文地址:https://www.cnblogs.com/rexienk/p/4955682.html
Copyright © 2011-2022 走看看