把数据库内容显示在listview上
数据库操作很简单,但用户想看见的是数据库里的内容,那么让数据库内容显示在屏幕上呢,下面做个简单演示,百变不离其中,先看步骤:
把数据库的数据显示至屏幕
1. 任意插入一些数据
定义Javabean:Person.java来封装name, phone, money 并设置get ,set , tostring方法
然后 读取数据库的所有数据:
Cursor cs = db.query("person", null, null, null, null, null, null); while(cs.moveToNext()){ String name = cs.getString(cs.getColumnIndex("name")); String phone = cs.getString(cs.getColumnIndex("phone")); String money = cs.getString(cs.getColumnIndex("money")); //把读到的数据封装至Person对象 Person p = new Person(name, phone, money); //把person对象保存至集合中 people.add(p); }
把集合中的数据显示至屏幕:
分页查询
Cursor cs = db.query("person", null, null, null, null, null, null, "0, 10"); //查询表0-10的条目,"10,10":从第10个条目开始向后查询10个
ListView
用于显示列表
MVC结构思想:
M:model模型层,要显示的数据 ————people集合
V:view视图层,用户看到的界面 ————ListView
C:control控制层,操作数据如何显示 ————adapter对象
BaseAdapter
封装度地 自由度高可以定制很多不同样式的listview
必须实现的两个方法
第一个 getcount
//系统调用此方法,用来获知模型层有多少条数据 @Override public int getCount() { return people.size(); }
第二个getview
//系统调用此方法,获取要显示至ListView的View对象 //position:是return的View对象所对应的数据在集合中的位置 @Override public View getView(int position, View convertView, ViewGroup parent) { System.out.println("getView方法调用" + position); TextView tv = new TextView(MainActivity.this); //拿到集合中的元素 Person p = people.get(position); tv.setText(p.toString()); //把TextView的对象返回出去,它会变成ListView的条目 return tv; }
屏幕上能显示多少个条目,getView方法就会被调用多少次,屏幕向下滑动时,getView会继续被调用,创建更多的View对象显示至屏幕
条目的缓存
convertView =
当条目划出屏幕时,系统会把该条目缓存至内存,当该条目再次进入屏幕,系统在重新调用getView时会把缓存的条目作为convertView参数传入,但是传入的条目不一定是之前被缓存的该条目,即系统有可能在调用getView方法获取第一个条目时,传入任意一个条目的缓存
ViewHolder缓存
class ViewHolder 封装View里的空间 用viewholder.XXXX来取出
思路写出来了 同学们自己试一下
MainActivity
package com.ace.sqlite; import java.util.ArrayList; import java.util.List; import android.os.Bundle; import android.app.Activity; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.view.LayoutInflater; import android.view.Menu; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.EditText; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.TextView; public class MainActivity extends Activity { List<Person> personList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); personList = new ArrayList<Person>(); //查询数据库 MyOpenHelper oh = new MyOpenHelper(this); SQLiteDatabase db = oh.getWritableDatabase(); Cursor cursor = db.query("person", null, null, null, null, null, null, null); while(cursor.moveToNext()){ String name = cursor.getString(1); String phone = cursor.getString(2); int salary = cursor.getInt(3); Person p = new Person(name, phone, salary); personList.add(p); } //找到listview ListView lv = (ListView) findViewById(R.id.lv); //设置显示内容 lv.setAdapter(new MyAdapter()); } class MyAdapter extends BaseAdapter{ //系统调用,用来获知模型层有多少条数据 @Override public int getCount() { return personList.size(); } //系统调用,返回的View对象就会作为ListView的一个条目显示在屏幕上 //position:该次getView调用返回的View对象在ListView中是第几个条目,position的值就是几 //convertView:系统之前缓存的条目 @Override public View getView(int position, View convertView, ViewGroup parent) { System.out.println("getView方法调用" + position + ":" + convertView); Person p = personList.get(position); // TextView tv = new TextView(MainActivity.this); // tv.setText(p.toString()); // tv.setTextSize(16); //获取布局填充器 // LayoutInflater inflater = LayoutInflater.from(MainActivity.this); // LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); // View view = inflater.inflate(R.layout.item_listview, null); View view = null; if(convertView == null){ //把布局文件填充成view对象 view = View.inflate(MainActivity.this, R.layout.item_listview, null); } else{ view = convertView; } //必须使用view.findViewById TextView tv_name = (TextView) view.findViewById(R.id.tv_name); tv_name.setText(p.getName()); TextView tv_phone = (TextView) view.findViewById(R.id.tv_phone); tv_phone.setText(p.getPhone()); TextView tv_salary = (TextView) view.findViewById(R.id.tv_salary); tv_salary.setText(p.getSalary() + ""); return view; } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } } }
MyOpenHelper
package com.ace.sqlite; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; public class MyOpenHelper extends SQLiteOpenHelper { public MyOpenHelper(Context context) { //arg1:数据库文件名字 //arg2:游标工厂,游标等同于结果集,传null使用默认工厂 //arg3:版本,不能小于1,用于升级 super(context, "people.db", null, 1); } //创建数据库时调用 @Override public void onCreate(SQLiteDatabase db) { //创建表 db.execSQL("create table person(_id integer primary key autoincrement, name char(10), phone char(20), salary integer(10))"); } //升级数据库时调用 @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { System.out.println("数据库升级"); } }
Person:
public class Person { private String name; private String phone; private int salary; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public int getSalary() { return salary; } public void setSalary(int salary) { this.salary = salary; } @Override public String toString() { return "name=" + name + ", phone=" + phone + ", salary=" + salary; } public Person(String name, String phone, int salary) { super(); this.name = name; this.phone = phone; this.salary = salary; } }
Test:
public class Test extends AndroidTestCase{ public void test(){ // 获取虚拟上下文 MyOpenHelper oh = new MyOpenHelper(getContext()); //如果数据库不存在,先创建,再打开,如果存在,就直接打开 SQLiteDatabase db = oh.getWritableDatabase(); //创建50条数据 ContentValues values = new ContentValues(); for (int i = 0; i < 50; i++) { values.clear(); values.put("name", "张" + i); values.put("phone", "135" +i+i); values.put("salary", "2000" + i); db.insert("person", null, values); } } }
list_item:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:id="@+id/tv_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="name" android:textSize="25sp" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" android:layout_alignParentRight="true" > <TextView android:id="@+id/tv_phone" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="phone" /> <TextView android:id="@+id/tv_salary" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="salary" /> </LinearLayout> </RelativeLayout>
activity.xml:
<LinearLayout 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" android:orientation="vertical" > <ListView android:id="@+id/lv" android:layout_width="match_parent" android:layout_height="match_parent" ></ListView> </LinearLayout>