Android 数据显示在屏幕上

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});
  • 3
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值