新思想

在 ListView 中显示 SQLite

SQLiteinListView

listviewitem.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent">

    <TextView
        android:id="@+id/tvname"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="name"
        android:textSize="26sp"
        />
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_alignParentRight="true"
        >
        <TextView
            android:id="@+id/tvphone"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="phone"
            />
        <TextView
            android:id="@+id/tvsalary"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="salary"
            />
    </LinearLayout>
</RelativeLayout>

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    tools:context="com.xiesir.example19sqliteinlistview.MainActivity">

    <ListView
        android:id="@+id/lv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></ListView>
</LinearLayout>

appOpenHelper.java:

package com.xiesir.example19sqliteinlistview;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

/**
 * Created by xiegly on 2016/5/30.
 */
public class appOpenHelper extends SQLiteOpenHelper {

    public appOpenHelper(Context context) {
        // arg1:上下文
        // arg2:数据库文件名
        // arg3:游标工厂,游标等同于结果集,传null使用默认工厂
        // arg4:版本,不能小于1,用于升级
        super(context, "contacts.db", null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // 创建表
        db.execSQL("create table person(_id integer primary key autoincrement, name char(10), phone char(18), salary integer(9))");
    }

    // 升级数据库时调用
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        Log.i("appOpenHelper", "数据库升级");
    }
}

Person.java:

package com.xiesir.example19sqliteinlistview;

/**
 * Created by xiegly on 2016/5/30.
 */
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;
    }

    public Person(String name, String phone, int salary) {
        this.name = name;
        this.phone = phone;
        this.salary = salary;
    }

    @Override
    public String toString() {
        return "姓名='" + name + '\'' +
                ", 电话='" + phone + '\'' +
                ", 工资=" + salary;
    }
}

MainActivity.java:

package com.xiesir.example19sqliteinlistview;

import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private appOpenHelper oh;
    private SQLiteDatabase db;

    List<Person> personList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        personList = new ArrayList<Person>();

        // 获取虚拟上下文
        oh = new appOpenHelper(this);
        // 如果数据库不存在,先创建,再打开,如果存在,就直接打开
        db = oh.getWritableDatabase();
        db.execSQL("delete from person");

        // 创建50条数据
        ContentValues values = new ContentValues();
        for (int i = 1; i <= 50; i++) {
            values.clear();
            values.put("name", "张" + i);
            if (i < 10) {
                values.put("phone", "1385168970" + i);
                values.put("salary", "500" + i);
            } else {
                values.put("phone", "138516897" + i);
                values.put("salary", "50" + i);
            }
            db.insert("person", null, values);
        }

        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());
    }

    private 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.listviewitem, null);
            else
                view = convertView;

            // 必须使用view.findViewById
            TextView tvname = (TextView) view.findViewById(R.id.tvname);
            tvname.setText(p.getName());

            TextView tvphone = (TextView) view.findViewById(R.id.tvphone);
            tvphone.setText(p.getPhone());

            TextView tvsalary = (TextView) view.findViewById(R.id.tvsalary);
            tvsalary.setText(p.getSalary() + "");
            return view;
        }

        @Override
        public Object getItem(int position) {
            return null;
        }

        @Override
        public long getItemId(int position) {
            return 0;
        }
    }
}

源程序下载

参考:

posted on 2016-05-31 01:16  新思想  阅读(310)  评论(0)    收藏  举报

导航