在android系统中使用的是sqlite数据库,前面的简易登录系统已经讲述了数据库的应用。本例的重点是实现数据库与listview的绑定。demo的数据是将个人的信息绑定到listview中,并存在sqlite。

1.person类

 public class PersonInfo
{
public PersonInfo()
{ }
private String name;
private int age;
public void setNmae(String name)
{
this.name=name;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
public void setAge(int age)
{
this.age=age;
}
}

person

person类定义了name和age两个属性字段

2.list_item.xml

本例是将person信息绑定到listview中,有必要定义自己的listview项。

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" > <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/tvname" /> <TextView
android:id="@+id/tv_name"
android:layout_width="match_parent"
android:layout_height="wrap_content" /> </LinearLayout> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" > <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/tvage" /> <TextView
android:id="@+id/tv_age"
android:layout_width="match_parent"
android:layout_height="wrap_content" /> </LinearLayout>
</LinearLayout>

person_item

xml文档中定义了几个textview分别用来显示name和age。

3.main.xml

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" > <ListView
android:id="@+id/listView1"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</ListView> </RelativeLayout>

main.xml

main,xml只有一个listview,用来显示person

4.list_footer

listview可以添加底部或者头部的视图对象。

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <Button
android:id="@+id/bt_load"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="加载更多数据" />
<ProgressBar
android:id="@+id/pg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:visibility="gone"
/>
</LinearLayout>

footer

底部xml只有button,用来加载更多的数据。

5.personinfo.xml

本例的person信息是手动添加到数据库的,并不是在代码中自己生成的数据。

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" > <LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:orientation="horizontal" > <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/tvname" /> <EditText
android:id="@+id/edname"
android:layout_width="match_parent"
android:layout_height="wrap_content" /> </LinearLayout> <LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_weight="0"
android:orientation="horizontal" > <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/tvage" /> <EditText
android:id="@+id/edage"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="number" /> </LinearLayout> </LinearLayout>

personinfo

xml定义了edittext,写入nanme和age

6.menu.xml

menu是本例的重点,本来是研究menu的使用。

 <menu xmlns:android="http://schemas.android.com/apk/res/android" >

     <item android:showAsAction="ifRoom|withText" android:id="@+id/action_add" android:title="@string/action_add"></item>
<item android:showAsAction="ifRoom|withText" android:id="@+id/action_delete" android:title="@string/action_delete"></item>
<item
android:id="@+id/action_settings"
android:orderInCategory="100"
android:showAsAction="never"
android:title="@string/action_settings"/> </menu>

menu

本文档定义了几个菜单项,如果运行在3.0以上的android系统中,ui显示方式有很大不同。showasaction用来设置menu的显示方式。

     @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
public boolean onOptionsItemSelected(MenuItem menu)
{
switch(menu.getItemId())
{
case R.id.action_add:
addUser();
return true;
case R.id.action_delete:
//deleteUser();
return true;
default:
super.onOptionsItemSelected(menu);
}
return true;
}

menu

这段代码是menu的初始化以及对menu菜单项选中事件的监听。

7.contextmenu

本例个人信息的删除是用contextmenu实现的,用户长按lsitview的某一项,即可弹出删除的上下文菜单。

       public void onCreateContextMenu(ContextMenu menu,View view,ContextMenuInfo menuInof)

           {
super.onCreateContextMenu(menu, view, menuInof);
menu.add(0,1,Menu.NONE,"删除");
}
public boolean onContextItemSelected(MenuItem item)
{
switch(item.getItemId())
{
case 1:
deleteUser(delname);
return true;
default:
return false;
}
}

contextmenu

registerForContextMenu(listview);菜单注册到某视图。

8.addperson和deleteperson

添加和删除个人信息都与sqlite数据库相关。

 private static final String DATABASE_NAME="test";
public SQLiteHelper(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);
this.getWritableDatabase();
// TODO Auto-generated constructor stub
} @Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL("CREATE TABLE IF NOT EXISTS person"+"(id INTEGER PRIMARY KEY,name VARCHAR,age INTEGER)"); }
//关闭数据库
public void close()
{
this.getWritableDatabase().close();
}
public boolean Addperson(int age,String name)
{
try
{
ContentValues cv=new ContentValues();
cv.put("name", name);
cv.put("age", age);
this.getWritableDatabase().insert("person", null, cv);
return true;
}
catch(Exception ex)
{
return false;
}
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub }

sqlhelper

sqlhelper类用来数据库和表的创建,同时定义了添加person的方法。

 private void addUser() {
// TODO Auto-generated method stub
final LinearLayout layout=(LinearLayout)getLayoutInflater().inflate(R.layout.personinfo, null);
new AlertDialog.Builder(this).setTitle("添加联系人").setView(layout).setPositiveButton("确定",new OnClickListener() { @Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
EditText edname=(EditText)layout.findViewById(R.id.edname);
EditText edage=(EditText)layout.findViewById(R.id.edage);
String sql="select * from person where name=?";
Cursor cursor=sqlhelper.getWritableDatabase().rawQuery(sql, new String[]{edname.getText().toString()});
if(cursor.moveToFirst())
{
Toast.makeText(MainActivity.this, "已经存在", Toast.LENGTH_LONG).show();
}
else
{
if(sqlhelper.Addperson(Integer.parseInt(edage.getText().toString()), edname.getText().toString()))
{
PersonInfo person=new PersonInfo();
person.setNmae(edname.getText().toString());
person.setAge(Integer.parseInt(edage.getText().toString()));
list.add(person);
adapter.notifyDataSetChanged();
Toast.makeText(MainActivity.this, "信息添加成功", Toast.LENGTH_LONG).show();
}
}
}
}).setNegativeButton("取消", null).show();
}

addperson

该段代码实现了个人信息的添加,通过调用AlertDialog实现。点击menu中的添加之后,会弹出添加用户的对话框,点击确定信息将会被保存。

     private void deleteUser(String str) {
// TODO Auto-generated method stub
try
{
sqlhelper.getWritableDatabase().delete("person", "name=?", new String[]{str});
for(int i=0;i<list.size();i++)
{
PersonInfo person=list.get(i);
if(person.getName()==str)
{
list.remove(i);
}
}
adapter.notifyDataSetChanged();
}
catch(Exception ex)
{
Toast.makeText(this, "删除失败", Toast.LENGTH_LONG).show();
}
}

delteperson

个人信息删除调用sqlite的delete方法实现,需要传入表的名称,删除的条件。同时在完成数据的删除后,通知listview数据已经发生变化。本例将读取到的数据存在list中,所以移除了list中的数据。

9.Mybaseadapter

mybaseadapter是listview的适配器,继承与baseadapter。

 public class MyAdapter extends BaseAdapter
{ int count=5;
Context mcontext;
public MyAdapter(Context context)
{
mcontext=context;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
if(list.size()>5)
{
return count;
}
else
{
return list.size();
}
} @Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return null;
} @Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return 0;
} @Override
public View getView(int arg0, View arg1, ViewGroup arg2) {
// TODO Auto-generated method stub
PersonInfo person=new PersonInfo();
if(arg1==null)
{
arg1=LayoutInflater.from(mcontext).inflate(R.layout.person_item, null);
} person=(PersonInfo)list.get(arg0); TextView edname=(TextView)arg1.findViewById(R.id.tv_name);
TextView edage=(TextView)arg1.findViewById(R.id.tv_age);
edname.setText(person.name);
edage.setText(String.valueOf(person.age));
return arg1;
} }

baseadapter

本例定义每次只能显示5条数据。当小于5条数据的时候,将全部显示。这里设置返回的数目是关键。

   btnpro=(Button)moreview.findViewById(R.id.bt_load);
pg=(ProgressBar)moreview.findViewById(R.id.pg);
btnpro.setOnClickListener(new View.OnClickListener() { @Override
public void onClick(View v) {
// TODO Auto-generated method stub
pg.setVisibility(View.VISIBLE);// 将进度条可见
btnpro.setVisibility(View.GONE);// 按钮不可见
Handler hanldre=new Handler();
hanldre.postDelayed(new Runnable(){ @Override
public void run() {
// TODO Auto-generated method stub adapter.count+=5; btnpro.setVisibility(View.VISIBLE);
pg.setVisibility(View.GONE);
if(adapter.count>list.size()) {
adapter. count=list.size();
btnpro.setVisibility(View.INVISIBLE);
}
adapter.notifyDataSetChanged();
}}, 2000);
}
});

加载更多数据

这是加载更多数据按钮的监听事件。代码中新建了hanlder实例,用来加载更多的数据。其中当count大于list.size,count等于list.size.

10.系统退出

在android中,很多系统在用户按返回键的时候,并不是直接退出,而是弹出对话框。

  public boolean onKeyDown(int keyCode, KeyEvent event)
{
if(keyCode==KeyEvent.KEYCODE_BACK && event.getRepeatCount()==0)
{
new AlertDialog.Builder(this).setTitle("系统提示").setMessage("确定退出系统吗").setPositiveButton("确定", new OnClickListener() { @Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
android.os.Process.killProcess(android.os.Process.myPid());
}
}).setNegativeButton("取消", null).show();
return true;
}
else if(keyCode==KeyEvent.KEYCODE_MENU && event.getRepeatCount()==0)
{
openOptionsMenu();
return true;
}
return true;
}

系统退出

这个功能通过重写onkeydown方法实现。但是实现过程中发现menu菜单不能显示了,所以在这里加了一个判断,并调用了  openOptionsMenu()。

11.系统实例

Android学习之sqlite与listview的更多相关文章

  1. 七、Android学习第六天——SQLite与文件下载(转)

    (转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 七.Android学习第六天——SQLite与文件下载 SQLite SQ ...

  2. android学习--视图列表(ListView和ListActivity)

    说明: 视图列表(ListView和ListActivity)与AutoComplete.Spinner类似,它们都须要一个供显示的列表项,能够须要借助于内容Adapter提供显示列表项 创建List ...

  3. Android学习笔记(20)————利用ListView制作带竖线的多彩表格

    http://blog.csdn.net/conowen/article/details/7421805 /********************************************** ...

  4. Android学习笔记--Sqlite数据库

    前几天学习了Android中的数据存储,包括文件存储,SharedPreferences存储,还有就是Acndroid中的特色:SQLite数据库存储了.让我比较惊讶的是Android中竟然内嵌了一个 ...

  5. Android学习之SQLite学习

    花了2天时间,系统学习了下Android开发过程中使用的轻量级数据库SQLite的使用. 并掌握其增,删,该,查的基本数据库操作. 首先要使用SQLite数据库,须要通过Android系统提供的SQL ...

  6. Android学习笔记——SQLite

    该工程的功能是实现关于数据库的操作,即creat.update.insert.query.delete 调试的时候请用模拟器,用真机调试的时候进入cmd-adb shell,再进入cd data/da ...

  7. (转)Android学习笔记---SQLite介绍,以及使用Sqlite,进行数据库的创建,完成数据添删改查的理解

    原文:http://blog.csdn.net/lidew521/article/details/8655229 1.SQLite介绍:最大特点是,无数据类型;除了可以使用文件或SharedPrefe ...

  8. Android学习总结——SQLite

    SQLiteDatabase类: 一.使用sql语句操作数据库 SQLiteDatabase db = openOrCreateDatabase("database.db", MO ...

  9. Android学习----自定义Adapter实现ListView

    前言: 对于ListView而言,自定义的Adapter对于显示复杂的界面有很大的灵活性 .使用自定义的Adapter需要继承BaseAdapter,然后重写getCount(),getView(), ...

随机推荐

  1. sqlite数据库读写在linux下的权限问题

    近期在学linux,恰巧有个php项目要做.于是配置好环境打算在linux下做. 无奈站点执行后一片空白.经过调试发现是sqlite数据库的问题. 安装sqlite扩展 apt-get install ...

  2. C# 和Java的foreach的不同用法

    循环语句为苦逼的程序猿们提供了很大的便利,有while.do...while.for和 foreach.而且foreach语句很简洁,但是它的优点不仅仅在于此,它的效率也是最高的. 作为两个开发语言, ...

  3. javascript 事件代理及应用

    事件代理又叫事件委托在前端发开中实际是非常有用的,说事件代理之前我们先说说事件绑定 <p onclick="test()" ></p> function t ...

  4. 异常 java.lang.NumberFormatException: For input string:

    今天在写项目时,将String类型转换为Integer类型爆出此异常,记录如下: 代码如下: 1 String a = "2222222222"; //10个2 Integer b ...

  5. linux学习笔记之文件类型,及目录介绍

    引用A:http://www.cnblogs.com/xiaoluo501395377/archive/2013/04/20/3033131.html 引用B:http://www.cnblogs.c ...

  6. linux系统学习笔记:文件、目录、用户

    本篇主要从stat函数开始,逐个说明stat结构的每一个成员,以此来了解文件的所有属性.同时将说明修改这个属性的各个函数. 一.文件 使用stat函数族得到和文件有关的信息结构. #include & ...

  7. linux网络编程:三次握手与四次挥手

    建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 其中三次握手即建立连接 四次挥手则为关闭连接 TCP连接的11种状态 客户端独有的:(1)SYN_SENT (2)FIN ...

  8. 基于java的InputStream.read(byte[] b,int off,int len)算法学习

    public int read(byte[] b, int off, int len) throws IOException 将输入流中最多 len 个数据字节读入字节数组.尝试读取多达 len 字节 ...

  9. Android Studio默认产生Fragment

    package com.edaixi.fragment; import android.content.Context;import android.net.Uri;import android.os ...

  10. Python之路第九天,高级(1)-网络编程

    SOCKET编程 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. so ...