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 personList;    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        personList = new ArrayList();  //创建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 personList;    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        personList = new ArrayList();        // 把数据库中的数据读取出来        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);ListString,Object>> data =new ArrayListString,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});

更多相关文章

  1. Android(安卓)Studio “Cannot resolve symbol” 解决办法
  2. Android源码分析-全面理解Context
  3. 动态设置布局属性
  4. Android(安卓)Support Design 中 CoordinatorLayout 与 Behavior
  5. Android(安卓)自定义流式布局
  6. android监听虚拟键盘隐藏和显示事件
  7. Android(安卓)-- 再来一发Json
  8. 第一章:第一行android代码注解(4)
  9. Android(安卓)4.4 Kitkat Phone工作流程浅析(六)__InCallActivit

随机推荐

  1. Android应用程序需不需要手动退出? - 阿智
  2. HD文件管理器 v0.1.3----- 一款界面简约,
  3. Android异步任务的使用方法
  4. android 自动检测版本升级
  5. Android切近实战(八)
  6. Android分享到微信好友、朋友圈
  7. Android(安卓)创建自己的签名证书文件key
  8. Android(安卓)中的线程池
  9. 一些关于android屏幕的小知识
  10. Android按键监听与模拟分析