1、将数据库中查询的数据显示在屏幕上:
textview 是可以new出来的。
可以将集合中封装的对象信息 每一个对象对应一个TextView,将对象的信息设置到TextView中的文本信息框中。
LinearLayout ll = (LinearLayout) findViewById(R.id.ll);
for (Person p : personList)
{ //每一个对象对应一个TextView
TextView tv = new TextView(this);
//将人物的信息 設置到文本框中。
tv.setText(p.toString());
tv.setTextSize(18);//设置字体大小这里不带sp 参数是整型 api里面已经带过单位了。
//把TextView设置为线性布局的子节点为了显示到屏幕上。
ll.addView(tv); //addview 就是将textView设置为linearlayout 的子节点。
}
linearlayout 布局中的数据是不能滑动的要想得到滑动的效果可以在linearlayout上加一个scrollview节点
<ScrollView
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="${relativePackage}.${activityClass}" >
<LinearLayout
android:id="@+id/ll"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
</LinearLayout>
</ScrollView>
从数据库中将查询到的数据显示在屏幕上的全部代码:
思路:先将每一条记录 看成一个Person对象封装到javabean中方便对于数据的管理 将person对象放入到集合中。
2、每个Person 对象对应一个textView (用于在页面上显示对象的信息)
3、用Linearlayout 对象将textView 添加为其子节点 addView(); //把TextView设置为线性布局的子节点为了显示到屏幕上。 ll.addView(tv);
package com.zh.sqlitedatabase;
import com.zh.showdata.MyOpenHelper;
import android.app.DownloadManager.Query;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.test.AndroidTestCase;
//这是在测试框架下创建数据库。
public class TestCase extends AndroidTestCase {
private MyOpenHelper oh;
private SQLiteDatabase db;
public void test() {
MyOpenHelper oh = new MyOpenHelper(getContext());
// 如果数据库不存在就创建数据库,并获取可读可写的数据库对象,如果数据库存在就直接打开数据库。
SQLiteDatabase db = oh.getWritableDatabase();
}
// 测试框架执行完毕,测试方法执行之前进行调用。
protected void setUp() throws Exception {
// TODO Auto-generated method stub
super.setUp();
oh = new MyOpenHelper(getContext());
db = oh.getWritableDatabase();
}
// 摧毁 此方法是在方法执行完毕后才调用
protected void tearDown() throws Exception {
// TODO Auto-generated method stub
super.tearDown();
db.close();
}
public void insert() {
for(int i =0; i<50;i++){
ContentValues values = new ContentValues();
values.put("name", "赵"+i);
values.put("salary","160"+i+i);
values.put("phone","139"+i);
db.insert("person", null, values);
}
}
}
package com.zh.showdata.domain;
public class Person { //封装数据
private String _id;
private String name;
private String salary;
private String phone;
@Override
public String toString() {
return name + ";"+salary +";"+phone;
}
public String get_id() {
return _id;
}
public void set_id(String _id) {
this._id = _id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSalary() {
return salary;
}
public void setSalary(String salary) {
this.salary = salary;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
//构造函数方便 创建对象
public Person(String _id, String name, String salary, String phone) {
super();
this._id = _id;
this.name = name;
this.salary = salary;
this.phone = phone;
}
}
package com.zh.showdata;
import java.util.ArrayList;
import java.util.List;
import com.zh.showdata.domain.Person;
import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.LinearLayout;
import android.widget.TextView;
public class MainActivity extends Activity {
List<Person> personList;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
personList = new ArrayList<Person>(); //创建person对象的list集合 用于封装person对象。
// 把数据库中的数据读取出来
MyOpenHelper oh = new MyOpenHelper(this);
SQLiteDatabase db = oh.getWritableDatabase();
Cursor cursor = db.query("person", null, null, null, null, null, null, "10,10"); //这里面有个分页条件 第十条开始 显示10条记录。
while (cursor.moveToNext()) {
String _id = cursor.getString(0);
String name = cursor.getString(1);
String salary = cursor.getString(2);
String phone = cursor.getString(3);
Person p = new Person(_id, name, salary, phone);
personList.add(p); // 将查询到的人放到Arraylist集合当中。
}
LinearLayout ll = (LinearLayout) findViewById(R.id.ll);
for (Person p : personList)
{
TextView tv = new TextView(this);
//将人物的信息 設置到文本框中。
tv.setText(p.toString());
tv.setTextSize(18);
//把TextView设置为线性布局的子节点为了显示到屏幕上。
ll.addView(tv);
}
}
}
以上方法做列表形式的屏幕显示过于繁杂没有效率。
对于大量数据时数据对象的封装循环,和每个对象对应每个TextView循环占用内存会很大,有内存溢出的可能性。
limit 分页时设置条件 “10,10” 第一个数据表示的是从第10行数据开始显示,第二个数据表示显示10条数据。
专门用来显示列表的视图 listview 列表视图实际开发运用很常见。
(它实现了屏幕上消失和加载新的数据的算法保证屏幕显示的记录数)
ListView 列表视图组件:
默认每行有一条Item 就是一条条目。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/ll"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</ListView>
</LinearLayout>
ListView 对比javaWeb中的三层架构。
MVC架构
* M:模型层 —- javaBean —- personList 用户要查看的内容
* V:视图层 —- jsp —- ListView 将模型层中的内容显示在上面 (用户直接看到的是ListView)
* C:控制层 —- servlet —- Adapter 充当控制层,控制personList里面的内容显示在ListView
Adapter
* ListView的每个条目都是一个View对象
* Ctrl+T eclipse下查看该类的所有父类和子类
Adapter 适配器 是个接口需要实现的方法很多,这种情况下查看其子类 常用 base default XXX;
ListView的每个条目都是一个View对象 View对象包括TextView EditView Button …… 只要是View对象都可以显示ListView的条目中。
用ListView将数据显示在屏幕上:
1、
ListView lv = (ListView) findViewById(R.id.lv);
lv.setAdapter(new MyAdapter());
BaseAdapter是一个抽象类 定义一个内部类继承其并复写其方法:
// 定义一个内部类继承BaseAdapter //抽象类
class MyAdapter extends BaseAdapter {
// 由系统调来调取 获取集合中有多少元素。
@Override
public int getCount() {
// TODO Auto-generated method stub
return personList.size(); //注意不能随便添加数据 系统运行会报错。
}
// 有系统调用返回一个View对象。ListView每一个条目就是一个View对象。 该方法返回一个View对象。
@Override // position 表示每一条条目的位置。
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
TextView tv = new TextView(MainActivity.this);
Person p= personList.get(position) //这里position 是调用集合中对象在集合中的位置。跟参数刚好一致从第零个位置开始.
tv.setText(p.toString());
tv.setTextSize(18);
return tv;
}
//最后两个方法不用管它就行
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
封装Person对象并从数据库中查询数据;
public class MainActivity extends Activity {
List<Person> personList;
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 _id = cursor.getString(cursor.getColumnIndex("_id"));
String name = cursor.getString(1);
String salary = cursor.getString(2);
String phone = cursor.getString(3);
System.out.println(name + salary + phone);
Person p = new Person(_id, name, salary, phone);
personList.add(p); // 将查询到的人放到Arraylist集合当中。
}
ListView lv = (ListView) findViewById(R.id.lv);
lv.setAdapter(new MyAdapter());
}
将布局文件填充一个View对象:
ViewGroup 可以有子节点 比如五大布局
View v= View.inflate(MainActivity.this, resource, root);
不同的布局文件可以出现相同应用资源id,区别资源id引用的id的方法:
setContentView(R.layout.activity_main); //设置的显示内容的资源引用id 就在activity_main 布局文件当中
//把布局文件填充成有个View对象
View v= View.inflate(MainActivity.this, resource, root);
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
Person p = personList.get(position);
//将布局文件填充一个View对象; //这个是布局文件的引用资源id
View v = View.inflate(MainActivity.this, R.layout.listview_layout, null);
TextView tv_name = (TextView) v.findViewById(R.id.name);
tv_name.setText(p.getName());
TextView tv_gz = (TextView) v.findViewById(R.id.gz);
tv_gz.setText(p.getSalary());
TextView tv_phone = (TextView) v.findViewById(R.id.phone);
tv_phone.setText(p.getPhone());
return v;
}
另一种方法是布局填充器:
LayoutInflater inflater = LayoutInflater.from(MainActivity.this);
// inflater.inflate(resource, root)
inflater.inflate(R.layout.listview_layout, null); //使用布局文件填充器填充布局文件 得到View对象
LayoutInflater inflater = LayoutInflater.from(MainActivity.this);
View view2 = inflater.inflate(R.layout.listview_layout, null);
LayoutInflater inflater3 = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
View view3= inflater3.inflate(R.layout.listview_layout, null);
布局文件:
listview_layout 布局文件
<?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/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="名字"
android:textSize="22sp" />
<TextView
android:id="@+id/gz"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:text="薪资"
android:textSize="12sp" />
<TextView
android:id="@+id/phone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:text="电话"
android:textSize="12sp"
android:layout_below="@id/gz"
android:layout_alignRight="@id/gz"
android:layout_alignLeft="@+id/gz"
/>
</RelativeLayout>
利用缓存优化ListView ;
convertView 缓存视图
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
Person p = personList.get(position); //这个地方的位置对象 ListView 显示的条目对应,保证后面缓存出现后对文本框赋值的正确性。
// 将布局文件填充一个View对象;
View v;
if(convertView==null){
v = View.inflate(MainActivity.this, R.layout.listview_layout, null);
}
else{
v=convertView; //注意在这里对ListView缓存的优化相当有必要 View对象存在就用缓存 对于内存方面减少了不小的压力。
}
TextView tv_name = (TextView) v.findViewById(R.id.name);
tv_name.setText(p.getName());
TextView tv_gz = (TextView) v.findViewById(R.id.gz);
tv_gz.setText(p.getSalary());
TextView tv_phone = (TextView) v.findViewById(R.id.phone);
tv_phone.setText(p.getPhone());
return v;
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
}
}
Adapter:
ArrayAdapter 数组适配器只能接收一种数据类型: //objects 是个数组 要显示的数据内容
ArrayAdapter adpater = new ArrayAdapter(context, resource, textViewResourceId, objects)
布局layout 文件:
<?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="wrap_content"
android:orientation="horizontal" >
<ImageView
android:layout_width="40dp"
android:layout_height="40dp"
android:src="@drawable/photo" />
<TextView
android:layout_gravity="center_vertical" //水平方向 竖直居中可以执行
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="名字"
android:textSize="22sp"
/>
</LinearLayout>
用simpleadapter 控制模型层中的数据在listView组件视图中显示。
SimpleAdapter
SimpleAdapter sa= new SimpleAdapter(context, data, resource, from, to)
ListView lv= (ListView)findViewByid(R.id.lv);
List<Map<String,Object>> data =new ArrayList<Map<String,Object>>
Map<String,Object> map1= new HashMap<String,Object>();
map1.put("photo",R.drawable.photo1);
map1.put("name","张三")
data.add(map1);
Map<String,Object> map2 = new HashMap<String, Object>();
map2.put("photo", R.drawable.photo1);
map2.put("name", "小志爹");
data.add(map2);
Map<String,Object> map3 = new HashMap<String, Object>();
map3.put("photo", R.drawable.photo2);
map3.put("name", "小志孙子");
data.add(map3); //map中定义的key 对应到布局文件的组件的哪个组件由资源id一一对应。
lv.setAdapter(new SimpleAdapter(this,data,R.layout.listview_layout,new String[]{"photo","name"},new int[]{R.id.iv,R.id.tv});