liaokang.java 发表于 2013-1-30 01:01:32

Android ListView详解

在android应用中,数据以列表的形式显示通常是通过ListView来实现,下面是一个ListView入门的小例子

1.首先是主布局文件main.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    ><RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="wrap_content">    <TextViewandroid:layout_width="60px"android:layout_height="wrap_content"android:id="@+id/idTitle"android:text="编号"/>   <TextViewandroid:layout_width="150px"android:layout_height="wrap_content"android:layout_alignTop="@id/idTitle"android:layout_toRightOf="@id/idTitle"android:id="@+id/name"android:text="姓名"/>   <TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignTop="@id/name"android:layout_toRightOf="@id/name"android:text="年龄"/></RelativeLayout><ListViewandroid:layout_width="fill_parent"    android:layout_height="wrap_content"    android:id="@+id/listView"/></LinearLayout>

2.然后是列表所要用到的布局文件,在layout目录下新建personitem.xml文件,代码如下
<?xml version="1.0" encoding="utf-8"?><RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="wrap_content">    <TextViewandroid:layout_width="60px"android:layout_height="wrap_content"android:id="@+id/personid"/>   <TextViewandroid:layout_width="150px"android:layout_height="wrap_content"android:layout_alignTop="@id/personid"android:layout_toRightOf="@id/personid"android:id="@+id/personname"/>   <TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignTop="@id/personname"android:layout_toRightOf="@id/personname"android:id="@+id/personage"/></RelativeLayout>

用到的实体bean为Person,代码如下
package com.lamp.domain;public class Person {private Integer personid = null;private String name = null;private Integer age = null;public Person() {}public Person(String name,Integer age){this.name = name;this.age = age;}public Integer getPersonid() {return personid;}public void setPersonid(Integer personid) {this.personid = personid;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "name: " + this.name + ", age:" + this.age;}}

3.接着是Activity代码
package com.lamp.db;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import android.app.Activity;import android.database.Cursor;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.AdapterView;import android.widget.ListView;import android.widget.SimpleAdapter;import android.widget.SimpleCursorAdapter;import com.lamp.domain.Person;import com.lamp.service.PersonService;public class DBActivity extends Activity {private ListView listView = null;private PersonService personService = null;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);personService = new PersonService(this);listView = (ListView) this.findViewById(R.id.listView);List<HashMap<String, String>> data = new ArrayList<HashMap<String, String>>();List<Person> personList = personService.getScrollData(0, 10);HashMap<String,String> map = null;for(Person person : personList){map = new HashMap<String,String>();map.put("personid", String.valueOf(person.getPersonid()));map.put("name", person.getName());map.put("age", String.valueOf(person.getAge()));data.add(map);}SimpleAdapter simpleAdapter = new SimpleAdapter(this, data,R.layout.personitem,new String[] { "personid", "name", "age" }, new int[]{R.id.personid,R.id.personname,R.id.personage});listView.setAdapter(simpleAdapter);/* * 这是通过游标在ListView控件上显示数据,需要注意的是主键字段名id应改为_id,否则会报错Cursor cursor = personService.getRawScrollData(0, 10);SimpleCursorAdapter simpleCursorAdapter = new SimpleCursorAdapter(this, R.layout.personitem,cursor,new String[] { "_id", "name", "age" }, new int[]{R.id.personid,R.id.personname,R.id.personage});listView.setAdapter(simpleCursorAdapter);*///为item选项设置监听listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){public void onItemClick(AdapterView<?> parent, View view, int position,long id) {ListView listView = (ListView)parent;Map<String,String> map = (HashMap<String, String>)listView.getItemAtPosition(position);Log.i("DBActivity", map.get("age"));}});}}

4.业务层代码如下
package com.lamp.service;import java.util.ArrayList;import java.util.List;import android.content.Context;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import com.lamp.domain.Person;public class PersonService {private DataBaseOpenHelper dbHelper = null;private SQLiteDatabase sqLiteDatabase = null;public PersonService(Context context) {dbHelper = new DataBaseOpenHelper(context);sqLiteDatabase = dbHelper.getWritableDatabase();}public void save(Person person){String sql = "insert into person(name,age) values (?,?)";sqLiteDatabase.execSQL(sql, new Object[]{person.getName(),person.getAge()});}//指定删除public void delete(Integer personid){String sql = "delete from person where personid=?";sqLiteDatabase.execSQL(sql,new Object[]{personid});}//批量删除public void deletePersons(Integer... ids){StringBuilder sb = new StringBuilder();if(ids.length > 0){for (int i = 0; i < ids.length; i++) {sb.append('?').append(',');}sb.deleteCharAt(sb.length()-1);String sql = "delete from person where personid in ("+ sb +")";sqLiteDatabase.execSQL(sql,(Object[])ids);}}//更新数据public void update(Person person){String sql = "update person set name=?,age=? where personid=?";sqLiteDatabase.execSQL(sql, new Object[]{person.getName(),person.getAge(),person.getPersonid()});}//得到全部的结果集public List<Person> getAllPersons(){String sql = "select name,age from person";Cursor cursor = sqLiteDatabase.rawQuery(sql, null);Person person = null;List<Person> personList = new ArrayList<Person>();while(cursor.moveToNext()){String name = cursor.getString(0);int age = cursor.getInt(1);person = new Person(name,age);personList.add(person);}return personList;}//分页取数据public List<Person> getScrollData(Integer start, Integer size){String sql = "select personid, name,age from person limit ?,?";Cursor cursor = sqLiteDatabase.rawQuery(sql, new String[]{String.valueOf(start),String.valueOf(size)});List<Person> personList = new ArrayList<Person>();Person person = null;while(cursor.moveToNext()){int personid = cursor.getInt(0);String name = cursor.getString(1);int age = cursor.getInt(2);person = new Person(name,age);person.setPersonid(personid);personList.add(person);}return personList;}//返回游标对象,当要在ListView中显示数据时,主键的字段名需设定为_id,否则返回的Cursor对象会出错public Cursor getRawScrollData(Integer start, Integer size){String sql = "select personid as _id, name,age from person limit ?,?";return sqLiteDatabase.rawQuery(sql, new String[]{String.valueOf(start),String.valueOf(size)});}//返回表中总记录条数public int getCount(){String sql = "select count(*) from person";Cursor cursor = sqLiteDatabase.rawQuery(sql, null);if(cursor.moveToNext()){return cursor.getInt(0);}return 0;}}

5.由于用到了android的SQLite数据库,对数据库操作的工具类代码如下
package com.lamp.service;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;public class DataBaseOpenHelper extends SQLiteOpenHelper {private static final String DBNAME = "android";private static final int VERSION = 1;public DataBaseOpenHelper(Context context) {super(context, DBNAME, null, VERSION);}@Overridepublic void onCreate(SQLiteDatabase sqLiteDatabase) {String sql = "create table person (personid integer primary key autoincrement,name varchar(20),age integer)";sqLiteDatabase.execSQL(sql);}@Overridepublic void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {String sql = "drop table if exists person";sqLiteDatabase.execSQL(sql);onCreate(sqLiteDatabase);}}

首先通过单元测试往数据库中添加若干条记录,然后运行项目看到记录以列表的形式显示
页: [1]
查看完整版本: Android ListView详解