首页 > 技术文章 > 把数据库内容显示在listview上

AceIsSunshineRain 2016-01-31 11:57 原文

数据库操作很简单,但用户想看见的是数据库里的内容,那么让数据库内容显示在屏幕上呢,下面做个简单演示,百变不离其中,先看步骤:

把数据库的数据显示至屏幕
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>

 

推荐阅读